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

89

Ich suche nach einer einfachen Möglichkeit, 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.

Sorin
quelle
15
@ Karlphilip: Auf jeden Fall nein. Die Frage hier ist ganz anders.
Joey
1
Sie sollten eine akzeptierte Antwort markieren.
Jeb

Antworten:

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

Wenn Sie dies für verschiedene Erweiterungen benötigen, wiederholen Sie einfach Folgendes PATHEXT:

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

Könnte sein, dass es whereauch bereits in älteren Windows-Versionen existiert, aber ich habe keinen Zugriff auf eine, daher kann ich es nicht sagen. Auf meinem Computer 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 wahrscheinlich auch die Ausgabe umleiten NUL.

Merken Sie sich

Das Parsen in Batch ( .bat) - Dateien und in der Befehlszeile ist unterschiedlich (da Batch-Dateien %0- %9) haben, daher müssen Sie das %dort verdoppeln . In der Kommandozeile ist dies nicht erforderlich, also für Variablen nur %X.

Joey
quelle
1
Ich mag Ihren Ansatz, aber es wäre noch besser, wenn Sie die Vollversion bereitstellen könnten, die auch PATHEXT dafür verwendet.
Sorin
4
Für XP benötigen Sie das Loop-Skript (oder laden Sie where.exe vom RK herunter). Vista und 7 werden mit where.exe ausgeliefert. Ich weiß, dass das OP speziell XP sagte, aber für die Nachwelt ist die beste Antwort immer zu verwenden where myExecutable.
Ryan Bemrose
Ryan: Huh? Ich glaube nicht, dass ich Ihren Satz analysieren kann.
Joey
2
Ich bin ein Anfänger im Batch-Scripting und bin mir nicht sicher, was %% x bedeutet. Auf meinem Windows 7-System habe ich versucht, Folgendes einzugeben: für %% X in (myExecutable.exe) do (setze FOUND = %% ~ $ PATH: X) und drücke dann return. Ich habe dies als Antwort erhalten: C: \ Users \ James> für %% X in (cmd.exe) do (set FOUND = %% ~ $ PATH: X) %% X war zu diesem Zeitpunkt unerwartet.
Simgineer
3
simengineer: Das Parsen in Batch-Dateien und in der Befehlszeile ist unterschiedlich (da Batch-Dateien %0- haben %9), daher müssen Sie das %dort verdoppeln . In der Befehlszeile ist dies nicht erforderlich, daher sind forVariablen nur %x.
Joey
79

Windows Vista und spätere Versionen werden mit einem Programm geliefert where.exe, das nach Programmen im Pfad sucht. Es funktioniert so:

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

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

Zur Verwendung in einer Batch-Datei können Sie den /qSchalter verwenden, der nur ERRORLEVELeine Ausgabe festlegt 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
Ryan Bemrose
quelle
Sehr schön und einfach! Vielen Dank!
Pawel Cioch
18

Hier ist eine einfache Lösung , dass Versuche , die Anwendung und Griffe jeden Fehler laufen hinterher .

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

Fehlercode 9009 bedeutet normalerweise, dass die Datei nicht gefunden wurde.

Der einzige Nachteil ist, dass file.exees tatsächlich ausgeführt wird, wenn es gefunden wird (was in einigen Fällen nicht wünschenswert ist).

eadmaster
quelle
24
Der einzige Nachteil ist, dass "file.exe" ausgeführt wird (was in einigen Fällen unerwünscht ist)
eadmaster
6

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. Beispielsweise:

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

Chris Noe
quelle
1
Interessanter Trick mit setlocalaber for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)ist eine einzeilige Lösung, fordie als Workaround %%~$PATH:Xverwendet wird, um callund zu vermeiden %~$PATH:1.
Gavenkoa
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%"=="" ....
PabloG
quelle
3
Funktioniert nicht, da fores nicht klug genug ist, den Inhalt von zu analysieren PATH. Es fehlen beispielsweise Verzeichnisse mit Leerzeichen. Und selbst wenn Sie for /fmit delims=;ihm wird nicht korrekt funktionieren , wenn ein Verzeichnis ein enthält ;und zitiert wird.
Joey
@ Joey, wie wäre es mit String-Ersatz? Ersetzen ;durch "; ": set quotedPath="%PATH:;="; "%".
XP1
1
XP1: Nein, immer noch nutzlos. Probieren Sie es aus, indem Sie "C:\Folder with; semicolon, quoted"an den Pfad anhängen und sehen, was passiert. Zumindest wird hier versucht, jedes »Wort« einzeln zu behandeln, was in gewisser Weise schlimmer ist als das vorherige Verhalten.
Joey
0

Manchmal funktioniert diese einfache Lösung, bei der Sie überprüfen, ob die Ausgabe Ihren Erwartungen entspricht. In der ersten Zeile wird der Befehl ausgeführt und die letzte Zeile der Standardausgabe abgerufen.

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
bdombro
quelle
Was aber, wenn die Systemumgebung eine andere Sprache verwendet?
Beachwalker
0

Wenn Sie etwas wie mich im Startordner suchen, sollte Ordner gehen. Zum Beispiel suche ich exe im 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!
)
Zafer ATLI
quelle
Aber dies sucht im vollständigen Pfad, ob der program.exeexistiert, nicht nur in einem Ordner
jeb
-1

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

Es wird True zurückgeben, wenn es vorhanden ist, andernfalls False.

akkidukes
quelle
Das wird nicht funktionieren. Test-PathÜberprüft nur den angegebenen Pfad, dh Test-Path nuget.exegibt nur dann true zurück, wenn nuget.exees sich im aktuellen Verzeichnis befindet. Wenn sich nuget.exe nicht im aktuellen Verzeichnis befindet, wird false zurückgegeben, auch wenn es sich in einem Verzeichnis befindet, das in der Variablen PATH aufgeführt ist. In PowerShell Get-Commandfunktioniert dies möglicherweise besser ( stackoverflow.com/questions/11242368/… ). Beachten Sie jedoch, dass sich das aktuelle Verzeichnis für PowerShell nicht im Pfad befindet.
Ronald Zarīts
1
Wie @RonaldZarits hervorhob, können Sie für die vollständige PowerShell-Unterstützung den Get-Befehl mit zwei Optionen verwenden. Geben Sie zuerst den aktuellen Verzeichnisstandort und dann nur den Exe-Namen an. (Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $nullwird true zurückgeben, wenn es lokal oder im Pfad gefunden wird.
John C
-1

Für diejenigen, die nach einer PowerShell-Option suchen. Sie können das Get-CommandCmdlet verwenden, das zwei Elemente übergibt. Geben Sie zuerst den aktuellen Verzeichnisort mit dem .\Präfix an und dann nur den exe-Namen.

(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null

Dies gibt true zurück, wenn es lokal oder in systemweiten Pfaden gefunden wird.

John C.
quelle
Nichts ist besser als Benutzer herunterzustimmen und auszuführen. Wenn Sie nicht einverstanden sind und bis zur Abwertung gehen, fügen Sie auch einen Kommentar hinzu, um Ihren Grund anzugeben, warum Sie nicht einverstanden sind, dass dies kein guter Ansatz ist, um die gewünschten Ergebnisse zu erzielen.
John C