Szukam prostego sposobu na sprawdzenie, czy plik wykonywalny istnieje w zmiennej środowiskowej PATH z pliku wsadowego systemu Windows.
Korzystanie z narzędzi zewnętrznych, które nie są dostarczane przez system operacyjny, jest niedozwolone. Minimalna wymagana wersja systemu Windows to Windows XP.
Odpowiedzi:
Jeśli potrzebujesz tego dla różnych rozszerzeń, po prostu powtórz
PATHEXT
:Możliwe, że
where
istnieje już w starszych wersjach systemu Windows, ale nie mam dostępu do jednej, więc nie mogę powiedzieć. Na moim komputerze działa również:i zwraca z niezerowym kodem zakończenia, jeśli nie można go znaleźć. Jednak w przypadku wsadu prawdopodobnie chcesz również przekierować dane wyjściowe do
NUL
.Pamiętać
Parsowanie w
.bat
plikach batch ( ) iw wierszu poleceń różni się (ponieważ pliki wsadowe mają%0
-%9
), więc musisz podwoić to%
. W linii poleceń nie jest to konieczne, więc dla zmiennych są po prostu%X
.źródło
where myExecutable
.%0
-%9
), więc musisz%
tam podwoić . W linii poleceń nie jest to konieczne, więcfor
zmienne są po prostu%x
.System Windows Vista i nowsze wersje są dostarczane z programem o nazwie,
where.exe
który wyszukuje programy w ścieżce. Działa to tak:Do użycia w pliku wsadowym możesz użyć
/q
przełącznika, który po prostu ustawiaERRORLEVEL
i nie generuje żadnych wyników.Lub prostą (ale mniej czytelną) skróconą wersję, która drukuje wiadomość i zamyka aplikację:
źródło
Oto proste rozwiązanie, które próbuje uruchomić aplikację i obsługuje później każdy błąd .
Kod błędu 9009 zwykle oznacza, że nie znaleziono pliku.
Jedynym minusem jest to, że
file.exe
jest faktycznie wykonywany, jeśli zostanie znaleziony (co w niektórych przypadkach nie jest pożądane).źródło
Można to osiągnąć poprzez podstawianie parametrów.
Zwraca pełną ścieżkę do nazwy pliku wykonywalnego w% 1, w przeciwnym razie pusty ciąg.
Nie działa to ze zmiennymi zdefiniowanymi przez użytkownika. Więc jeśli nazwa pliku wykonywalnego nie jest parametrem twojego skryptu, potrzebujesz podprogramu. Na przykład:
Zobacz http://ss64.com/nt/syntax-args.html
źródło
setlocal
którafor %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
jestfor
używana jako obejście%%~$PATH:X
w celu uniknięciacall
i%~$PATH:1
.źródło
for
nie jest wystarczająco inteligentny, aby przeanalizować zawartośćPATH
. Pominie na przykład katalogi ze spacjami. I nawet jeśli używaszfor /f
zdelims=;
nim, nie będzie działać poprawnie, jeśli katalog zawiera;
i jest cytowany.;
z"; "
:set quotedPath="%PATH:;="; "%"
."C:\Folder with; semicolon, quoted"
do ścieżki i zobacz, co się stanie. Przynajmniej tutaj próbuje traktować każde »słowo« osobno, co w pewnym sensie jest gorsze niż wcześniejsze zachowanie.Czasami działa to proste rozwiązanie, w którym sprawdzasz, czy dane wyjściowe są zgodne z oczekiwaniami. Pierwsza linia uruchamia polecenie i przechwytuje ostatni wiersz standardowego wyjścia.
źródło
Jeśli szukasz czegoś takiego jak ja w folderze startowym, powinieneś przejść do folderu. Na przykład wyszukuję exe w folderze startowym i używam tego kodu jak
źródło
program.exe
istnieje, nie tylko w jednym folderzeUżyj polecenia: powershell Test-Path „exe, którego szukasz”
Zwróci True, jeśli jest obecny, w przeciwnym razie False.
źródło
Test-Path
sprawdza tylko określoną ścieżkę, tj.Test-Path nuget.exe
zwróci wartość true tylko wtedy, gdynuget.exe
znajduje się w bieżącym katalogu. Jeśli nuget.exe nie znajduje się w bieżącym katalogu, zwróci wartość false, nawet jeśli znajduje się w katalogu wymienionym w zmiennej PATH. W PowerShellGet-Command
może działać lepiej ( stackoverflow.com/questions/11242368/… ), ale weź pod uwagę, że dla PowerShell bieżący katalog nie znajduje się w ścieżce.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
zwróci wartość true, jeśli zostanie znaleziony lokalnie lub w ścieżce.Dla tych, którzy szukają opcji PowerShell. Możesz użyć polecenia
Get-Command
cmdlet przekazującego dwa elementy. Najpierw podaj aktualną lokalizację katalogu z.\
prefiksem, a następnie podaj tylko nazwę exe.(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
To zwróci prawdę, jeśli zostanie znalezione lokalnie lub w ścieżkach całego systemu.
źródło