¿Dónde está “START” buscando ejecutables?

En mi compañía usamos un archivo por lotes para iniciar Matlab. El archivo por lotes prepara el entorno antes de iniciar Matlab.

El mismo Matlab comienza con

START MATLAB.EXE 

Tengo varias versiones de Matlab instaladas en mi sistema. Y este comando está comenzando la versión incorrecta de Matlab. ¿Dónde está START buscando los ejecutables?

Command start encuentra ejecutables para ejecutar como el intérprete de línea de comandos que hace cmd.exe si no se utiliza una ruta absoluta, utilizando adicionalmente las extensiones listadas en la variable de entorno PATHEXT separadas por punto y coma si la extensión del archivo también falta.

  1. Directorio de trabajo actual.

  2. Todos los directorios de la variable de entorno PATH en orden tal como se detalla en RUTA .

    Simplemente escriba una set path de set path a la ventana del símbolo del set path para ver todos los directorios en PATH así como todas las extensiones de archivo en PATHEXT .

    Tenga en cuenta que cada cuenta de usuario tiene su propia RUTA . Por lo tanto, la RUTA de la cuenta del sistema generalmente es diferente a la RUTA de una cuenta de usuario estándar. Esto es muy importante al ejecutar un archivo por lotes con comandos runas o mediante el progtwigdor de tareas utilizando una cuenta diferente.

    El archivo por lotes publicado por Jason Faulkner es muy útil aquí, también.

  3. inicio se ve más en el registro debajo de las teclas

    HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ App Paths
    HKEY_CURRENT_USER \ Software \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ App Paths
    HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ App Paths
    HKEY_LOCAL_MACHINE \ Software \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ App Paths

    Las aplicaciones instaladas con un paquete MSI (incrustadas en el instalador EXE o publicadas por separado) utilizando msiexec tienen su nombre de archivo registrado en las rutas de la aplicación con el valor de cadena predeterminado que contiene el nombre del ejecutable con la ruta completa. A menudo hay un segundo valor de cadena con el nombre Ruta que contiene solo la ruta completa al ejecutable de la aplicación. Otros instaladores registran una aplicación también en las App Paths , consulte el artículo de Microsoft sobre el registro de la aplicación .

La clave App Paths en el subárbol de registro HKEY_CURRENT_USER generalmente no existe, ya que la instalación se realiza utilizando un instalador de confianza o una cuenta de administrador local y, por lo tanto, el registro de la aplicación instalada se realiza en la sección de registro HKEY_LOCAL_MACHINE . Pero en una instalación por usuario de una aplicación, la ruta HKCU se usa para el registro de la aplicación en lugar de la ruta HKLM .

La clave App Paths en la clave Wow6432Node existe solo en Windows x64. Sin embargo, las aplicaciones x86 se registran generalmente en ambas rutas de aplicaciones, aunque Wow6432Node es para aplicaciones de 32 bits y el otro árbol para aplicaciones de 64 bits en Windows 7 x64, Windows Server 2008 R2 x64 y posterior Windows x64. Para obtener detalles, consulte el artículo de Microsoft Claves de registro afectadas por WOW64 .

Una nota más:

Incluso con .exe especificado, inicie las búsquedas en el directorio de trabajo actual y en los directorios de PATH después de encontrar AppName.exe adicionalmente para AppName.exe.* Y comprueba la extensión de archivo (cadena después del último período) contra las extensiones de archivo en PATHEXT si esto devuelve uno o más nombres de archivo. Sin embargo, siempre es mejor especificar la extensión de archivo de la aplicación para que se inicie, ya que la búsqueda de AppName.exe siempre se realiza primero antes de que se ejecute la búsqueda con comodín si AppName.exe no se pudo encontrar en el directorio actual.

La herramienta gratuita Process Monitor de Sysinternals (Microsoft) es una gran herramienta para descubrir cosas como esa.

Por último, pero no menos importante, para ningún ejecutable, las comprobaciones también inician HKEY_CLASSES_ROOT para que una asociación de archivos abra un archivo o un URI (URL) con la aplicación asociada definida para el comando abrir . Esa es la razón por la cual algo como a continuación también funciona.

 start MyTextFile.txt start https://stackoverflow.com/ 

%SystemRoot%\System32\cmd.exe contiene el código para el start utiliza la función de shell de Windows ShellExecuteEx para ejecutar aplicaciones o abrir archivos o URL con la aplicación asociada.

Puede usar este archivo de proceso por lotes para detectar dónde el sistema resuelve el EXE en cuestión:

 @ECHO OFF REM Save this as C:\CheckPath.bat IF NOT "%~$PATH:1" == "" ( ECHO %~$PATH:1 ) ELSE ( ECHO Could not find "%~1" inside of a registered PATH. ) 

Ahora en ejecución:

  • C:\CheckPath.bat cmd.exe devuelve C:\Windows\System32\cmd.exe
  • C:\CheckPath.bat NotValid.exe devuelve Could not find "NotValid.exe" inside of a registered PATH.

Intente ejecutar CheckPath.bat MATLAB.exe y podrá ver dónde está resolviendo la ruta el sistema.

Nota: esto resolverá el directorio suponiendo que no está redefiniendo %PATH% en su secuencia de comandos.