2011-01-24 16 views
71

Sto cercando un modo semplice per verificare se esiste un eseguibile nella variabile di ambiente PATH da un file batch di Windows.Come verificare se esiste un eseguibile nel% PATH% da un file batch di Windows?

L'utilizzo di strumenti esterni non forniti dal sistema operativo non è consentito. La versione minima di Windows richiesta è Windows XP.

+1

possibile duplicato di [Come verificare se un file esiste nel batch DOS] (http://stackoverflow.com/questions/4340350/how-to-check-if-a-file-exists-in-dos-batch) – karlphillip

+13

@karlphilip: Sicuramente no. La domanda qui è abbastanza diversa. – Joey

+1

Devi contrassegnare una risposta accettata. – Jeb

risposta

59
for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X) 
if defined FOUND ... 

Se avete bisogno di questo per diverse estensioni, poco un'iterazione su PATHEXT:

set FOUND= 
for %%e in (%PATHEXT%) do (
    for %%X in (myExecutable%%e) do (
    if not defined FOUND (
     set FOUND=%%~$PATH:X 
    ) 
) 
) 

potrebbe essere che where esiste anche già sulle versioni precedenti di Windows, ma non hanno accesso a uno, in modo da Non posso dire. Sulla mia macchina funziona anche:

where myExecutable 

e restituisce con un codice di uscita diverso da zero se non è stato trovato. In un batch probabilmente si desidera reindirizzare l'output a NUL, tuttavia.

+1

Mi piace il tuo approccio, ma sarebbe ancora meglio se tu potessi fornire la versione completa, quella che usa anche PATHEXT per questo. – sorin

+4

Per XP è necessario lo script di loop (o download where.exe dall'RK). Vista e 7 viene fornito con where.exe. So che l'OP ha detto specificamente XP, ma per i posteri la risposta migliore è sempre quella di usare "where myExecutable". –

+0

Ryan: Huh? Non penso di poter analizzare la tua frase. – Joey

0
@echo off 
set found= 
set prog=cmd.exe 
for %%i in (%path%) do if exist %%i\%prog% set found=%%i 
echo "%found%" 
if "%found%"=="" .... 
+2

Non funziona perché 'for' non è abbastanza intelligente da analizzare il contenuto di' PATH'. Ad esempio, mancheranno le directory con gli spazi. E anche quando usi 'for/f' con' delims =; 'non funzionerà correttamente se una directory contiene un'; 'ed è quotata. – Joey

+0

@ Joey, che ne pensi della sostituzione delle stringhe? Sostituisci ';' con '"; "::' set quotedPath = "% PATH:; ="; "%" '. – XP1

+0

XP1: No, ancora inutile. Provalo aggiungendo '" C: \ Folder with, punto e virgola, quotato "' al percorso e guarda cosa succede. Almeno qui cerca di trattare ogni "parola" separatamente che, in un certo senso, è peggiore del comportamento precedente. – Joey

0

A volte questa soluzione semplice funziona, dove si controlla se l'uscita corrisponde a ciò che si aspetta. La prima riga esegue il comando e afferra l'ultima riga dello standard output.

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i 
if "%xcopyoutput%"=="" echo xcopy not in path. 
+0

Ma cosa succede se l'ambiente di sistema utilizza un'altra lingua? – Beachwalker

4

Questo può essere eseguito tramite la sostituzione dei parametri.

%~$PATH:1 

Restituisce il percorso completo del nome file eseguibile in% 1, altrimenti una stringa vuota.

Questo non funziona con le variabili definite dall'utente. Quindi se il nome file eseguibile non è un parametro per il tuo script, allora hai bisogno di una subroutine. Per esempio:

call :s_which app.exe 
if not "%_path% == "" (
    app.exe 
) 

goto :eof 

:s_which 
    setlocal 
    endlocal & set _path=%~$PATH:1 
    goto :eof 

Vedi http://ss64.com/nt/syntax-args.html

+0

Interessante trucco con 'setlocal' ma' per %% X in (myExecutable.exe) do (set FOUND = %% ~ $ PATH: X) 'è una soluzione a riga con' for' usata come soluzione alternativa per '%% ~ $ PERCORSO: X' per evitare 'call' e'% ~ $ PATH: 1'. – gavenkoa

16

Ecco una soluzione semplice che tenta di eseguire l'applicazione e gestisce ogni errore seguito.

file.exe /? 2> NUL 
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path 

Il codice di errore 9009 indica in genere un file non trovato.

L'unico lato negativo è che file.exe viene effettivamente eseguito se trovato (che in alcuni casi non è consigliabile).

+0

sì questa è una soluzione semplice e corretta! –

+20

l'unico svantaggio è che "file.exe" viene eseguito (che in alcuni casi è indesiderato) – eadmaster

51

Windows Vista e versioni successive vengono forniti con un programma chiamato where.exe che ricerca i programmi nel percorso. Funziona in questo modo:

D:\>where notepad 
C:\Windows\System32\notepad.exe 
C:\Windows\notepad.exe 

D:\>where where 
C:\Windows\System32\where.exe 

Per l'utilizzo in un file batch è possibile utilizzare l'interruttore /q, che ha appena imposta ERRORLEVEL e non produce alcun output.

where /q myapplication 
IF ERRORLEVEL 1 (
    ECHO The application is missing. Ensure it is installed and placed in your PATH. 
    EXIT /B 
) ELSE (
    ECHO Application exists. Let's go! 
) 

o una versione semplice (ma meno leggibile) stenografia che stampa il messaggio ed esce la vostra applicazione:

where /q myapplication || ECHO Cound not find app. && EXIT /B 
+0

Molto bello e semplice! Grazie! –

0

Utilizzare il comando: powershell Test-Path "exe, che si cerca di"

Restituirà True se presente, altrimenti False.

+0

Questo non funzionerà. 'Test-Path' controlla solo il percorso specificato, ad esempio' Test-Path nuget.exe' restituirà true solo se 'nuget.exe' si trova nella directory corrente. Se nuget.exe non si trova nella directory corrente, restituirà false, anche se si trova in una directory elencata nella variabile PATH. In PowerShell 'Get-Command' potrebbe funzionare meglio (http://stackoverflow.com/questions/11242368/powershell-test-if-executable-in-path), ma tenere presente che per PowerShell la directory corrente non è nel sentiero. –

Problemi correlati