winhlp32 versiones software para microsoft hlp ejecutable descargar basadas ayuda archivos archivo abrir windows batch-file cmd

windows - versiones - ¿Cuál es la razón por la cual "X no se reconoce como un comando interno o externo, programa operativo o archivo por lotes"?



windows xp microsoft (2)

Tengo un fragmento de una línea que funciona perfectamente en la línea de comando, pero falla y arroja errores cuando lo ejecuto como parte de un script por lotes.

Los siguientes comandos se comportan como se esperaba, eliminando todas las subcarpetas vacías de la carpeta.

for /f "delims=" %d in (''dir /s /b /ad ^| sort /r'') do rd "%d"

Sin embargo, cuando se coloca en un archivo por lotes como este ...

FOR /f "delims=" %%d in (''dir /s /b /ad ^| sort /r'') do rd "%%d"

... arroja el error estándar:

Ordenar no se reconoce como un comando interno o externo

He estado experimentando durante la última hora más o menos con y sin escapar de la tubería, cambiando el orden de las opciones, buscando la documentación de dir y sort , etc., pero aún no he podido averiguar qué es pasando aquí El resto del archivo por lotes, que son solo unas pocas líneas, funciona bien, y esta es la única línea que falla.

¿Alguien puede ayudar?


A) ¿Cómo busca los comandos el intérprete de comandos de Windows?

El intérprete de comandos de Windows busca un comando para ejecutar

  1. no es un comando interno de cmd.exe y
  2. solo se especifica con el nombre del archivo sin extensión de archivo y sin ruta

para un archivo que coincida con el command.* patrón command.* y que tenga una extensión de archivo enumerada en la variable de entorno local PATHEXT

  1. primero en el directorio actual y
  2. siguiente en todos los directorios de la variable de entorno local PATH .

SORT y FIND y FINDSTR y ROBOCOPY y XCOPY y muchos más comandos no son comandos internos de cmd.exe . Son aplicaciones de consola instaladas con Windows ubicadas en el directorio %SystemRoot%/System32 tienen el nombre de archivo sort.exe , find.exe , findstr.exe , robocopy.exe , xcopy.exe , ...

Dichas aplicaciones de consola disponibles de forma predeterminada en Windows se denominan comandos externos para distinguirlas mejor de las aplicaciones de consola que no están instaladas con el sistema operativo Windows.

B) ¿Cómo se define la variable de entorno PATH?

Hay 3 tipos de variables PATH :

  1. PATH sistema que se utiliza para todas las cuentas y se almacena en el registro de Windows bajo la clave:

    HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Session Manager/Environment

  2. PATH usuario que se usa solo para la cuenta corriente y se almacena en el registro de Windows bajo la clave:

    HKEY_CURRENT_USER/Environment

  3. PATH local, que siempre es una copia de la PATH local del proceso principal que inició el proceso actual.

Windows concatena la PATH sistema y del usuario con la PATH local para la instancia del Explorador de Windows utilizada como escritorio de Windows con los accesos directos en la pantalla del escritorio y el menú de inicio de Windows como interfaz visible para el usuario.

Al iniciar un nuevo proceso, Windows copia toda la tabla de variables de entorno actualmente activas del proceso en ejecución para el nuevo proceso.

El proceso padre no puede modificar las variables de entorno de ningún proceso hijo ni un proceso hijo puede modificar las variables de entorno de su proceso padre.

Esto significa que una vez que se inició un proceso como cmd.exe para la ejecución de un archivo por lotes, el proceso tiene su propio conjunto de variables de entorno que solo el proceso en sí puede modificar. Ningún otro proceso puede modificar las variables de entorno de un proceso que ya se está ejecutando.

C) ¿Qué significa el mensaje de error?

El mensaje de error

''...'' no se reconoce como un comando interno o externo,
programa operable o archivo por lotes.

siempre significa que

  1. el nombre de archivo de un

    • aplicación de consola
    • Aplicación GUI
    • script (archivo por lotes, script de PowerShell, script de Perl, VBScript, JScript, ...)


    se especificó para la ejecución muy probablemente sin extensión de archivo y sin ruta (completa) al archivo ejecutable / script y

  2. Windows no pudo encontrar un archivo que coincida con el patrón FileName.* Con una extensión de archivo que figura en la variable de entorno PATHEXT actualmente activa en el directorio actual o cualquier otro directorio en la variable de entorno PATH actualmente activa.

D) ¿Cuáles son las posibles razones de este mensaje de error?

Las razones típicas son:

1. El nombre del archivo a ejecutar se especificó incorrectamente debido a un error de escritura.

Verifique carácter por carácter el nombre del comando / ejecutable.

2. El directorio actual es diferente al directorio que contiene el archivo a ejecutar.

Ejecutar echo Current directory is: %CD% en la línea de comando o agregue esta línea al archivo por lotes sobre la línea de comando que no puede ver cuál es el directorio actual.

3. El ejecutable o script para ejecutar no está instalado en absoluto.

Verifique la existencia del ejecutable a ejecutar. Algunos paquetes de instalación funcionan solo si otros paquetes como Java, NPM, PHP, etc. se instalaron anteriormente.

4. El directorio del archivo a ejecutar no está en PATH en absoluto.

Abra en el Panel de control de Windows la ventana Configuración del sistema , haga clic en Configuración avanzada del sistema en el lado izquierdo, haga clic en el botón Variables de entorno y busque en la lista Path y sus valores. Por defecto, Path solo existe en la lista de variables del Sistema .

5. Un proceso / aplicación en ejecución no se reinició después de modificar el sistema o la PATH usuario .

El usuario o un instalador realizó una modificación de la PATH del sistema o la PATH usuario con el comando setx o mediante el Panel de control - Sistema - pero un proceso / aplicación ya en ejecución como un símbolo del sistema abierto o la ventana de PowerShell no se cerró / salió y abierto / reiniciado después de la modificación de la PATH . Esto es necesario como se describe en detalle en el capítulo F) a continuación.

6. No se encuentra un ejecutable en %SystemRoot%/System32 en Windows de 64 bits.

Existe el directorio %SystemRoot%/System32 con ejecutables de 64 bits y %SystemRoot%/SysWOW64 con ejecutables de 32 bits en Windows de 64 bits. La mayoría de los ejecutables existen en ambos directorios. Pero hay algunos ejecutables que existen solo en System32 y algunos solo en SysWOW64 .

La PATH sistema contiene, de manera predeterminada, la primera ruta de carpeta %SystemRoot%/System32 . Pero cuál de las dos carpetas del sistema busca el ejecutable especificado sin ruta o con la ruta %SystemRoot%/System32 depende del entorno de ejecución. Una aplicación o script ejecutado en un entorno de 64 bits realmente está accediendo a %SystemRoot%/System32 mientras que una aplicación o script ejecutado en un entorno de 32 bits es redirigido por el redirector del sistema de archivos de Windows al directorio %SystemRoot%/SysWOW64 .

Una aplicación o script que se ejecuta en un entorno de 32 bits que desea ejecutar un ejecutable de 64 bits en %SystemRoot%/System32 tiene que usar el nombre completo del archivo ejecutable con la ruta de archivo %SystemRoot%/Sysnative .

Nota: %SystemRoot%/Sysnative no es un directorio ni ningún tipo de enlace. Es algo muy especial que existe solo para aplicaciones x86. No existe para aplicaciones amd64. La condición if exist %SystemRoot%/Sysnative en un archivo por lotes siempre es falsa en ambos entornos, pero if exist %SystemRoot%/Sysnative/cmd.exe es verdadera en el entorno de ejecución de 32 bits y falsa en el entorno de 64 bits y también en 32 bits Windows Esta condición se puede usar en scripts por lotes para averiguar si el archivo por lotes es procesado por cmd.exe 32 bits en %SystemRoot%/SysWOW64 en Windows de 64 bits, lo que puede ser importante saber según la tarea.

Consulte también la documentación de Microsoft Detalles de implementación WOW64 y claves de registro afectadas por WOW64 .

7. La variable LOCAL PATH se modificó antes en la línea de comandos o en un archivo por lotes.

Ejecute set path en la línea de comando o agregue este comando al archivo por lotes sobre la línea de comando que no puede ver los valores actuales de las variables de entorno PATH y PATHEXT .

La última razón es responsable de que el comando externo SORT no se encuentre en la ejecución del archivo por lotes que contiene algún lugar por encima de la set path=...

E) ¿Cómo evitar este mensaje de error?

Lo mejor es codificar un archivo por lotes para que sea independiente en PATH y PATHEXT y el orden de los directorios en PATH que significa aquí usar la línea de comando:

FOR /f "delims=" %%d in (''dir /s /b /ad ^| %SystemRoot%/System32/sort.exe /r'') do rd "%%d"

Cualquier comando externo cuyo ejecutable esté almacenado en %SystemRoot%/System32 debe especificarse en un archivo por lotes con esta ruta y con la extensión de archivo .exe . Luego, el intérprete de comandos de Windows no necesita buscar un archivo utilizando PATH y PATHEXT locales y el archivo por lotes funciona siempre (siempre que la variable de entorno SystemRoot no se modifique en el archivo por lotes que nunca he visto).

F) ¿Cuándo se aplica un cambio de RUTA del sistema o usuario a los procesos?

Cuando un usuario abre una ventana de símbolo del sistema a través del menú de inicio de Windows o desde una ventana del Explorador de Windows, el usuario inicia cmd.exe con la opción /K implícita para mantener abierta la ventana de la consola después de finalizar un comando que es bueno para depurar un archivo por lotes .

Cuando se hace doble clic en un archivo por lotes en el Explorador de Windows, el usuario inicia cmd.exe para procesar el archivo por lotes implícitamente con la opción /C para cerrar la ventana de la consola después de finalizar el procesamiento por lotes que no es bueno para depurar un archivo por lotes ya que los mensajes de error no pueden ser visto en este caso.

En ambos casos, Windows crea una copia de las variables de entorno de la aplicación que inicia cmd.exe que generalmente es el Explorador de Windows. Por lo tanto, el proceso de comando iniciado tiene una PATH local cuyo valor es el mismo que el proceso primario al iniciar cmd.exe .

Ejemplo:

  1. Abra una ventana de símbolo del sistema, ejecute el title Process1 y ejecute set path .
    La salida es PATH y PATHEXT como se define actualmente para la cuenta de usuario actual en la ventana de la consola que ahora tiene el título de la ventana Process1 .

  2. Ejecute set PATH=%SystemRoot%/System32 y luego, una vez más, set path .
    La salida es nuevamente PATH y PATHEXT , pero con PATH que ahora solo contiene un directorio.

  3. Ejecute el start "Process2" y ejecute en la nueva ventana de la consola con el título de la ventana Proceso2 la set path del comando.
    La salida es PATH y PATHEXT con los mismos valores que antes en Process1 .
    Esto demuestra que al iniciar un nuevo proceso, las variables de entorno actuales del proceso en ejecución se copian y no lo que Windows ha almacenado actualmente en el registro de Windows.

  4. Ejecute en Process2 el comando set PATH= y la siguiente set path .
    La salida es solo PATHEXT porque la PATH local ya no existe para Process2 .
    Esto demuestra que cada proceso puede modificar sus variables de entorno, incluida la eliminación completa.

  5. Cambie a la ventana Proceso1 , ejecute el comando set PATH=%PATH%;%SystemRoot% y la siguiente set path .
    La salida es PATH con dos directorios y PATHEXT .

  6. Ejecute el comando start "Process3" y en la ventana abierta con el título Process3, la set path comandos.
    La salida es PATH con dos directorios como se define también para Process1 y PATHEXT .

  7. Ejecute en Process3 el comando set PATH=%SystemRoot%/System32 .

Hay 3 procesos de comando que se ejecutan con los siguientes valores para la PATH local cuando %SystemRoot% expande a C:/Windows :

Proceso1 : PATH=C:/Windows/System32;C:/Windows
Process2 : PATH no existe en absoluto.
Proceso3 : PATH=C:/Windows/System32

Entonces, ¿qué sucede ahora al abrir el Panel de control - Sistema - Configuración avanzada del sistema - Variables de entorno y agregar a la lista de Variables de usuario la nueva variable de entorno PATH con valor C:/Temp , o en caso de que ya exista una PATH entorno PATH usuario , edite PATH y anexar ;C:/Temp al valor?

Bueno, mientras se abra la ventana de diálogo con el título Variables de entorno que muestra las dos listas, no sucede nada al modificar las variables, hasta que se hace clic en el botón Aceptar para tomar todos los cambios en el registro de Windows y cerrar la ventana.

Volvamos a los 3 procesos de comando en ejecución y ejecutemos en Process1 , Process2 y Process3 la set path comandos. Se puede ver:

Proceso1 : PATH=C:/Windows/System32;C:/Windows
Process2 : PATH no existe en absoluto.
Proceso3 : PATH=C:/Windows/System32

Nada ha cambiado en los procesos que ya se están ejecutando.

Ningún proceso puede modificar las variables de entorno de un proceso en ejecución.

Abra desde el menú de inicio de Windows una ventana más del símbolo del sistema y ejecute en el cuarto proceso del comando la set path comandos. Se puede ver que la PATH local del cuarto proceso de comando ha agregado el directorio C:/Temp ahora.

Luego cierre los 4 procesos de comando y elimine la PATH usuario agregada, respectivamente, elimine ;C:/Temp de la PATH del usuario si ha agregado esta ruta de directorio anteriormente.

¿Cómo es esto posible si ningún proceso puede modificar las variables de entorno de un proceso que ya se está ejecutando?

¿Cómo se modificó la lista de variables de entorno de la instancia del Explorador de Windows como escritorio de Windows al cerrar la ventana Variables de entorno con el botón Aceptar ?

La respuesta a esas dos preguntas fue dada por eryksun en su comentario.

Después de escribir las modificaciones en el sistema y las variables de usuario en el registro al hacer clic en el botón Aceptar de la ventana Variables de entorno , Windows envía el mensaje WM_SETTINGCHANGE a todas las ventanas de nivel superior para informar a las aplicaciones en ejecución sobre los parámetros cambiados del sistema.

Depende de la aplicación si este mensaje de evento se maneja y cómo. El Explorador de Windows que se ejecuta como escritorio de Windows lee las variables de entorno del registro y actualiza su lista de variables de entorno en consecuencia. Otras aplicaciones como Total Commander también manejan este mensaje y actualizan sus listas de variables de entorno. Pero cmd.exe no hace eso afortunadamente ya que esto sería realmente problemático.

¿Existe alguna posibilidad de modificar un sistema o variable de usuario con notificación a través de WM_SETTINGCHANGE desde una ventana de símbolo del sistema o un archivo por lotes?

Es posible modificar el valor de registro de una variable de entorno usando el comando reg add . Pero esto no da como resultado el envío del mensaje WM_SETTINGCHANGE a todas las ventanas de nivel superior. Dichos cambios realizados con reg add o con regedit requieren que se tenga en cuenta el reinicio de Windows (o al menos el cierre de sesión y el inicio de sesión del usuario actual).

Pero también existe el comando setx que está diseñado para modificar un sistema o variable de usuario y que también envía el mensaje WM_SETTINGCHANGE a todas las ventanas de nivel superior después de que el registro se haya actualizado de acuerdo con los argumentos especificados. Ejecute setx /? en una ventana de símbolo del sistema para más detalles. Pero tenga en cuenta que setx no modifica la variable de entorno local del proceso de comando en ejecución. Esto debe hacerse con el uso del set comandos utilizado además de setx .

G) ¿Cómo maneja Windows la variable de entorno PATHEXT?

Windows maneja la variable de entorno PATHEXT con la lista de extensiones de archivo en comparación con la variable de entorno PATH .

El sistema PATHEXT y el usuario PATHEXT NO están concatenados a PATHEXT local .

Un PATHEXT usuario reemplaza el PATHEXT del sistema para todos los procesos que se ejecutan en el entorno de la cuenta que tiene un PATHEXT usuario definido.

De manera predeterminada, solo se define una variable de entorno PATHEXT sistema .

H) ¿Es posible deshabilitar la búsqueda de archivos en el directorio actual?

El procesador de comandos de Windows busca de forma predeterminada en el directorio actual si el nombre de archivo de un archivo de script o ejecutable se especifica en la línea de comandos o en un archivo por lotes sin ninguna ruta, lo que significa sin una barra invertida / (o una barra diagonal / gracias a la corrección automática) en cadena de argumento.

Pero en Windows Vista y versiones posteriores del cliente de Windows y en Windows Server 2003 y versiones posteriores del servidor de Windows es posible deshabilitar la búsqueda de un script / ejecutable en el directorio actual especificado sin al menos una ruta relativa ./ Definiendo la variable de entorno NoDefaultCurrentDirectoryInExePath con cualquier valor según lo escrito por eryksun en su comentario a continuación y explicado por la documentación de Microsoft sobre la función NeedCurrentDirectoryForExePathA .

Consulte Eliminar el directorio de trabajo actual de la ruta para obtener más detalles sobre el uso de esta variable de entorno.


Lo más probable es que te hayas equivocado con la variable PATH . Quizás lo esté sobrescribiendo en otro lugar de su guión. Dado que sort es un comando externo, opuesto a todos los demás en su línea de comando, como for , dir , rd , que son comandos internos cmd , se necesita la variable PATH para encontrar el comando. Si PATH no está definido, los comandos externos se buscan solo en el directorio de trabajo actual. También hay una variable PATHEXT que se necesita para definir extensiones de archivo estándar para ejecutables, como .com , .exe . Entonces, cuando la sort aparece en el símbolo del sistema o en un archivo por lotes, el sistema busca en el directorio de trabajo actual y en todos los directorios especificados por la variable PATH un archivo con el nombre base sort y una de las extensiones especificadas por PATHEXT . El comando sort se llama sort.exe y generalmente se encuentra en C:/Windows/System32 .