Ich suche nach einer einfachen Methode, um zu testen, ob eine ausführbare Datei in der Umgebungsvariablen PATH aus einer Windows-Batchdatei vorhanden ist.
Die Verwendung externer Tools, die nicht vom Betriebssystem bereitgestellt werden, ist nicht zulässig. Die minimal erforderliche Windows-Version ist Windows XP.
for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
if defined FOUND ...
Wenn Sie dies für verschiedene Erweiterungen benötigen, iterieren Sie einfach über PATHEXT
:
set FOUND=
for %%e in (%PATHEXT%) do (
for %%X in (myExecutable%%e) do (
if not defined FOUND (
set FOUND=%%~$PATH:X
)
)
)
Möglicherweise existiert auch where
bereits in älteren Windows-Versionen, aber ich habe keinen Zugriff auf eine, also kann ich nicht sagen. Auf meiner Maschine funktioniert auch Folgendes:
where myExecutable
und kehrt mit einem Exit-Code ungleich Null zurück, wenn er nicht gefunden wurde. In einem Stapel möchten Sie jedoch wahrscheinlich auch die Ausgabe nach NUL
umleiten.
Merken Sie sich
Das Parsing in Batchdateien (.bat
) und in der Befehlszeile unterscheidet sich (da Batchdateien %0
– %9
haben), so dass Sie den %
dort verdoppeln müssen. In der Befehlszeile ist dies nicht erforderlich, daher sind Variablen nur %X
.
Windows Vista und spätere Versionen werden mit einem Programm namens where.exe
ausgeliefert, das im Pfad nach Programmen sucht. Es funktioniert so:
D:\>where notepad
C:\Windows\System32\notepad.exe
C:\Windows\notepad.exe
D:\>where where
C:\Windows\System32\where.exe
Für die Verwendung in einer Batchdatei können Sie den Schalter /q
verwenden, der lediglich ERRORLEVEL
setzt und keine Ausgabe erzeugt.
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!
)
Oder eine einfache (aber weniger lesbare) Kurzversion, die die Nachricht druckt und Ihre App beendet:
where /q myapplication || ECHO Cound not find app. && EXIT /B
Hier ist eine einfache Lösung, die versucht, die Anwendung auszuführen und eventuelle Fehler danach zu behandeln.
file.exe /? 2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path
Der Fehlercode 9009 bedeutet normalerweise, dass die Datei nicht gefunden wurde.
Der einzige Nachteil ist, dass file.exe
tatsächlich ausgeführt wird, wenn es gefunden wird (was in manchen Fällen nicht wünschenswert ist).
Dies kann durch Parametersubstitution erreicht werden.
%~$PATH:1
Dies gibt den vollständigen Pfad des ausführbaren Dateinamens in% 1 zurück, andernfalls eine leere Zeichenfolge.
Dies funktioniert nicht mit benutzerdefinierten Variablen. Wenn der ausführbare Dateiname kein Parameter für Ihr Skript ist, benötigen Sie eine Unterroutine. Zum Beispiel:
call :s_which app.exe
if not "%_path%" == "" (
"%_path%"
)
goto :eof
:s_which
setlocal
endlocal & set _path=%~$PATH:1
goto :eof
Wenn Sie etwas wie mich auf Startordner suchen, sollte Ordner gehen. Zum Beispiel suche ich exe auf Startordner und ich benutze diesen Code wie
@echo off
cd C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
where /q program.exe
IF ERRORLEVEL 1 (
echo F | xcopy /Y /S /I /E "\\programsetup\programsetup.exe"
"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\program.exe"
) ELSE (
ECHO Application exists. Let's go!
)
Für alle, die eine PowerShell-Option suchen. Sie können das Get-Command
cmdlet verwenden, indem Sie zwei Elemente übergeben. Geben Sie zuerst den aktuellen Speicherort mit .\
an, und geben Sie dann nur den Exe-Namen an.
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
Das gibt true zurück, wenn es lokal oder in systemweiten Pfaden gefunden wird.
Manchmal funktioniert diese einfache Lösung, bei der Sie prüfen, ob die Ausgabe Ihren Erwartungen entspricht. Die erste Zeile führt den Befehl aus und erfasst die letzte Zeile der Standardausgabe.
FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
Verwenden Sie den Befehl: Powershell Test-Path "Exe, nach dem Sie suchen"
Wenn es anwesend ist, wird True zurückgegeben, andernfalls False.