webentwicklung-frage-antwort-db.com.de

Wie teste ich, ob eine ausführbare Datei in% PATH% aus einer Windows-Batchdatei vorhanden ist?

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.

79
sorin
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

63
Joey

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
60
Ryan Bemrose

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).

18
eadmaster

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

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

4
Chris Noe

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!
)
0
Zafer ATLI

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.

0
John C

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.
0
bdombro
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
0
PabloG

Verwenden Sie den Befehl: Powershell Test-Path "Exe, nach dem Sie suchen"

Wenn es anwesend ist, wird True zurückgegeben, andernfalls False.

0
akkidukes