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.
Antworten:
Wenn Sie dies für verschiedene Erweiterungen benötigen, wiederholen Sie einfach Folgendes
PATHEXT
:Könnte sein, dass es
where
auch 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: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
.quelle
where myExecutable
.%0
- haben%9
), daher müssen Sie das%
dort verdoppeln . In der Befehlszeile ist dies nicht erforderlich, daher sindfor
Variablen nur%x
.Windows Vista und spätere Versionen werden mit einem Programm geliefert
where.exe
, das nach Programmen im Pfad sucht. Es funktioniert so:Zur Verwendung in einer Batch-Datei können Sie den
/q
Schalter verwenden, der nurERRORLEVEL
eine Ausgabe festlegt und keine Ausgabe erzeugt.Oder eine einfache (aber weniger lesbare) Kurzversion, die die Nachricht druckt und Ihre App beendet:
quelle
Hier ist eine einfache Lösung , dass Versuche , die Anwendung und Griffe jeden Fehler laufen hinterher .
Fehlercode 9009 bedeutet normalerweise, dass die Datei nicht gefunden wurde.
Der einzige Nachteil ist, dass
file.exe
es tatsächlich ausgeführt wird, wenn es gefunden wird (was in einigen Fällen nicht wünschenswert ist).quelle
Dies kann durch Parametersubstitution erreicht werden.
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:
Siehe http://ss64.com/nt/syntax-args.html
quelle
setlocal
aberfor %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
ist eine einzeilige Lösung,for
die als Workaround%%~$PATH:X
verwendet wird, umcall
und zu vermeiden%~$PATH:1
.quelle
for
es nicht klug genug ist, den Inhalt von zu analysierenPATH
. Es fehlen beispielsweise Verzeichnisse mit Leerzeichen. Und selbst wenn Siefor /f
mitdelims=;
ihm wird nicht korrekt funktionieren , wenn ein Verzeichnis ein enthält;
und zitiert wird.;
durch"; "
:set quotedPath="%PATH:;="; "%"
."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.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.
quelle
Wenn Sie etwas wie mich im Startordner suchen, sollte Ordner gehen. Zum Beispiel suche ich exe im Startordner und ich benutze diesen Code wie
quelle
program.exe
existiert, nicht nur in einem OrdnerVerwenden Sie den Befehl: Powershell Test-Path "exe, nach dem Sie suchen"
Es wird True zurückgeben, wenn es vorhanden ist, andernfalls False.
quelle
Test-Path
Überprüft nur den angegebenen Pfad, dhTest-Path nuget.exe
gibt nur dann true zurück, wennnuget.exe
es 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 PowerShellGet-Command
funktioniert dies möglicherweise besser ( stackoverflow.com/questions/11242368/… ). Beachten Sie jedoch, dass sich das aktuelle Verzeichnis für PowerShell nicht im Pfad befindet.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
wird true zurückgeben, wenn es lokal oder im Pfad gefunden wird.Für diejenigen, die nach einer PowerShell-Option suchen. Sie können das
Get-Command
Cmdlet verwenden, das zwei Elemente übergibt. Geben Sie zuerst den aktuellen Verzeichnisort mit dem.\
Präfix an und dann nur den exe-Namen.Dies gibt true zurück, wenn es lokal oder in systemweiten Pfaden gefunden wird.
quelle