Bir Windows toplu iş dosyasındaki% PATH% içinde bir yürütülebilir dosya olup olmadığı nasıl test edilir?


90

Bir Windows toplu iş dosyasındaki PATH ortam değişkeninde bir yürütülebilir dosya olup olmadığını test etmenin basit bir yolunu arıyorum.

İşletim sistemi tarafından sağlanmayan harici araçların kullanımına izin verilmez. Gereken minimum Windows sürümü Windows XP'dir.



16
@karlphilip: Kesinlikle hayır. Buradaki soru oldukça farklı.
Joey

1
Kabul edilen bir cevabı işaretlemelisiniz.
Jeb

Yanıtlar:


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

Buna farklı uzantılar için ihtiyacınız varsa, tekrarlayın PATHEXT:

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

O olabilir whereben söyleyemem böylece, aynı zamanda eski Windows sürümlerinde zaten var, ama ben birine erişimi yok. Makinemde aşağıdakiler de çalışıyor:

where myExecutable

ve bulunamazsa sıfır olmayan bir çıkış koduyla döner. Yine de bir toplu işte, muhtemelen çıktıyı da yönlendirmek istersiniz NUL.

Aklında tut

Batch ( .bat) dosyalarında ve komut satırında ayrıştırma farklıdır (çünkü toplu iş dosyalarında %0- %9) vardır, bu yüzden %orayı ikiye katlamanız gerekir . Komut satırında bu gerekli değildir, bu nedenle değişkenler için sadece vardır %X.


1
Yaklaşımınızı beğendim, ancak bunun için PATHEXT kullanan tam sürümü de sunabilirseniz daha da iyi olur.
sorin

4
XP için döngü betiğine ihtiyacınız var (veya RK'dan where.exe dosyasını indirin). Vista ve 7, where.exe ile birlikte gelir. OP'nin özellikle XP dediğini biliyorum, ancak gelecek nesil için en iyi cevap her zaman kullanmaktır where myExecutable.
Ryan Bemrose

Ryan: Ha? Cümlenizi çözümleyebileceğimi sanmıyorum.
Joey

2
Ben bir toplu komut dosyası yazmaya yeni başlayanım ve %% x'in ne anlama geldiğinden emin değilim. Windows 7 sistemimde şunu yazmayı denedim: (myExecutable.exe) içindeki %% X için yapın (FOUND = %% ~ $ PATH: X olarak ayarlayın) ve sonra geri döndüm. Bunu yanıt olarak aldım: C: \ Users \ James> (cmd.exe) içindeki %% X için (FOUND = %% ~ $ PATH: X olarak ayarlayın) %% X şu anda beklenmedikti.
simgineer

3
simengineer: Toplu iş dosyalarında ve komut satırında ayrıştırma farklıdır (çünkü toplu iş dosyalarında %0- %9) vardır, bu nedenle %orayı ikiye katlamanız gerekir . Komut satırında bu gerekli değildir, bu nedenle fordeğişkenler adildir %x.
Joey

82

Windows Vista ve sonraki sürümler where.exe, yoldaki programları arayan bir programla birlikte gelir. Şu şekilde çalışır:

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

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

Bir toplu iş dosyasında kullanmak için /q, ERRORLEVELherhangi bir çıktıyı ayarlayan ve üretmeyen anahtarı kullanabilirsiniz .

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

Veya mesajı yazdırıp uygulamanızdan çıkan basit (ancak daha az okunabilir) bir kısaltma versiyonu:

where /q myapplication || ECHO Cound not find app. && EXIT /B

Çok güzel ve basit! Teşekkürler!
Pawel Cioch

18

İşte uygulamayı çalıştırmayı deneyen ve daha sonra herhangi bir hatayı ele alan basit bir çözüm .

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

Hata kodu 9009 genellikle dosyanın bulunamadığı anlamına gelir.

Tek dezavantajı, file.exebulunursa fiilen yürütülmesidir (bazı durumlarda bu arzu edilmez).


25
tek dezavantajı, "file.exe" nin çalıştırılmasıdır (bazı durumlarda bu istenmeyen bir
durumdur

6

Bu, parametre ikamesi yoluyla gerçekleştirilebilir.

%~$PATH:1

Bu,% 1'deki yürütülebilir dosya adının tam yolunu döndürür, aksi takdirde boş bir dize.

Bu, kullanıcı tanımlı değişkenlerle çalışmaz. Dolayısıyla, yürütülebilir dosya adı betiğiniz için bir parametre değilse, bir alt yordama ihtiyacınız vardır. Örneğin:

call :s_which app.exe
if not "%_path%" == "" (
  "%_path%"
)

goto :eof

:s_which
  setlocal
  endlocal & set _path=%~$PATH:1
  goto :eof

Bkz. Http://ss64.com/nt/syntax-args.html


1
İlginç bir hile setlocalama for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)sadece bir satır çözüm foriçin bir çözüm olarak kullanılmıştır %%~$PATH:Xönlemek amacıyla callve %~$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%"=="" ....

3
forİçeriğini ayrıştıracak kadar akıllı olmadığı için çalışmayacak PATH. Örneğin, boşluk içeren dizinleri gözden kaçırır. Ve onunla for /fbirlikte kullandığınızda bile, delims=;bir dizin a içeriyorsa ;ve alıntı yapılmışsa düzgün çalışmayacaktır .
Joey

@ Joey, dizi değiştirmeye ne dersin? Değiştir ;ile "; ": set quotedPath="%PATH:;="; "%".
XP1

1
XP1: Hayır, hala işe yaramaz. "C:\Folder with; semicolon, quoted"Yola ekleyerek deneyin ve ne olacağını görün. En azından burada, her »kelimeye« ayrı ayrı muamele etmeye çalışır ki bu, bir bakıma, önceki davranıştan daha kötüdür.
Joey

0

Bazen bu basit çözüm, çıktının beklediğinizle eşleşip eşleşmediğini kontrol ettiğiniz yerde çalışır. İlk satır komutu çalıştırır ve standart çıktının son satırını alır.

FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.

Peki ya sistem ortamı başka bir dil kullanıyorsa?
Beachwalker

0

Başlangıç ​​klasöründe benim gibi bir şey arıyorsanız, klasöre gitmelisiniz. Örneğin başlangıç ​​klasöründe exe araştırıyorum ve bu kodu şu şekilde kullanıyorum:

@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!
)

Ancak bu program.exe, yalnızca bir klasörde değil, varsa tüm
PATH'de

-1

Şu komutu kullanın: powershell Test-Yolu "aradığınız exe"

Mevcutsa True, aksi takdirde False döndürür.


Bu işe yaramayacak. Test-Pathyalnızca belirtilen yolu kontrol eder, yani Test-Path nuget.exeyalnızca nuget.exegeçerli dizinde ise true döndürür . NuGet.exe geçerli dizinde değilse, PATH değişkeninde listelenen bir dizinde olsa bile yanlış döndürür. PowerShell'de Get-Commanddaha iyi çalışabilir ( stackoverflow.com/questions/11242368/… ), ancak PowerShell için geçerli dizinin yolda olmadığını göz önünde bulundurun.
Ronald Zarīts

1
@RonaldZarits'in belirttiği gibi, tam PowerShell desteği için Get-Command'ı iki seçenekle kullanabilirsiniz. Önce mevcut dir konumunu verin, sonra sadece exe adını verin. (Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $nullyerel veya yolda bulunursa true döndürür.
John C

-1

PowerShell seçeneği arayanlar için. Get-Commandİki öğeyi geçiren cmdlet'i kullanabilirsiniz . Önce geçerli dir konumunu .\önekli olarak verin, sonra sadece exe adını verin.

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

Bu, yerel veya sistem genelindeki yollarda bulunursa doğru olarak dönecektir.


Olumsuz oy kullanmaktan ve kullanıcıları çalıştırmaktan daha iyi bir şey olamaz. Aynı fikirde değilseniz ve olumsuz oylama kadar ileri gidecekseniz, bunun istenen sonuçları elde etmede iyi bir yaklaşım olmadığına neden katılmadığınızı belirtmek için bir yorum da ekleyin.
John C
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.