Estoy buscando una forma sencilla de probar si existe un ejecutable en la variable de entorno PATH desde un archivo por lotes de Windows.
No se permite el uso de herramientas externas no proporcionadas por el sistema operativo. La versión mínima de Windows requerida es Windows XP.
Respuestas:
Si necesita esto para diferentes extensiones, simplemente repita
PATHEXT
:Podría ser que
where
ya exista en versiones heredadas de Windows, pero no tengo acceso a una, así que no puedo decirlo. En mi máquina también funciona lo siguiente:y regresa con un código de salida distinto de cero si no se pudo encontrar. Sin
NUL
embargo, en un lote al que probablemente también desee redirigir la salida .Tenga en cuenta
El análisis en
.bat
archivos por lotes ( ) y en la línea de comandos es diferente (porque los archivos por lotes tienen%0
-%9
), por lo que debe duplicar el valor de%
allí. En la línea de comandos, esto no es necesario, por lo que las variables son solo%X
.fuente
where myExecutable
.%0
-%9
), por lo que debe duplicar el valor de%
allí. En la línea de comandos, esto no es necesario, por lo que lasfor
variables son solo%x
.Windows Vista y versiones posteriores se envían con un programa llamado
where.exe
que busca programas en la ruta. Funciona así:Para usarlo en un archivo por lotes, puede usar el
/q
conmutador, que solo estableceERRORLEVEL
y no produce ninguna salida.O una versión abreviada simple (pero menos legible) que imprime el mensaje y sale de su aplicación:
fuente
Aquí es una solución simple que los intentos de ejecutar la aplicación y manijas de cualquier error posteriormente .
El código de error 9009 generalmente significa archivo no encontrado.
El único inconveniente es que
file.exe
se ejecuta realmente si se encuentra (lo que en algunos casos no es deseable).fuente
Esto se puede lograr mediante la sustitución de parámetros.
Esto devuelve la ruta completa del nombre del archivo ejecutable en% 1, de lo contrario una cadena vacía.
Esto no funciona con variables definidas por el usuario. Entonces, si el nombre del archivo ejecutable no es un parámetro para su secuencia de comandos, entonces necesita una subrutina. Por ejemplo:
Ver http://ss64.com/nt/syntax-args.html
fuente
setlocal
perofor %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
es una solución de una línea que sefor
utiliza como solución para%%~$PATH:X
evitarcall
y%~$PATH:1
.fuente
for
no es lo suficientemente inteligente como para analizar el contenido dePATH
. Perderá directorios con espacios, por ejemplo. E incluso cuando lo utilicefor /f
condelims=;
, no funcionará correctamente si un directorio contiene un;
y se cita.;
con"; "
:set quotedPath="%PATH:;="; "%"
."C:\Folder with; semicolon, quoted"
a la ruta y vea qué sucede. Al menos aquí intenta tratar cada »palabra« por separado, lo que, en cierto modo, es peor que el comportamiento anterior.A veces, esta solución simple funciona, donde verifica si el resultado coincide con lo que espera. La primera línea ejecuta el comando y toma la última línea de salida estándar.
fuente
Si está buscando algo como yo en la carpeta de inicio, debería ir a la carpeta. Por ejemplo, busco exe en la carpeta de inicio y uso este código como
fuente
program.exe
existe, no solo en una carpetaUse el comando: powershell Test-Path "exe que está buscando"
Devolverá True si está presente; de lo contrario, False.
fuente
Test-Path
solo verifica la ruta especificada, es decirTest-Path nuget.exe
, devolverá verdadero solo sinuget.exe
está en el directorio actual. Si nuget.exe no está en el directorio actual, devolverá falso, incluso si está en un directorio listado en la variable PATH. En PowerShellGet-Command
podría funcionar mejor ( stackoverflow.com/questions/11242368/… ), pero tenga en cuenta que para PowerShell el directorio actual no está en la ruta.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
devolverá verdadero si se encuentra local o en la ruta.Para aquellos que buscan una opción de PowerShell. Puede usar el
Get-Command
cmdlet pasando dos elementos. Primero proporcione la ubicación del directorio actual con el.\
prefijo, luego proporcione solo el nombre del exe.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
Eso devolverá verdadero si se encuentra localmente o en rutas de todo el sistema.
fuente