कैसे परीक्षण करने के लिए अगर एक निष्पादन योग्य विंडोज बैच फ़ाइल से% PATH% में मौजूद है?


90

मैं एक साधारण तरीके से परीक्षण करने के लिए देख रहा हूं कि क्या एक निष्पादन योग्य विंडोज बैच फ़ाइल से पाथ पर्यावरण चर में मौजूद है।

ओएस द्वारा प्रदान नहीं किए गए बाहरी उपकरणों के उपयोग की अनुमति नहीं है। आवश्यक न्यूनतम Windows संस्करण Windows XP है।



15
@ कार्लफिलिप: निश्चित रूप से नहीं। यहां सवाल बिल्कुल अलग है।
जोय

1
आपको एक स्वीकृत उत्तर को चिह्नित करना चाहिए।
जेब

जवाबों:


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

यदि आपको अलग-अलग एक्सटेंशन के लिए इसकी आवश्यकता है, तो बस इस पर PATHEXT:

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

हो सकता है कि whereयह भी पहले से ही विरासत विंडोज संस्करणों पर मौजूद है, लेकिन मेरे पास एक तक पहुंच नहीं है, इसलिए मैं नहीं बता सकता। मेरी मशीन पर निम्नलिखित भी काम करता है:

where myExecutable

और अगर यह नहीं मिल सका तो एक गैर-शून्य निकास कोड के साथ लौटता है। एक बैच में आप शायद आउटपुट को पुनर्निर्देशित करना चाहते हैं NUL, हालांकि।

याद रखो

बैच ( .bat) फ़ाइलों में और कमांड लाइन पर पार्स करना अलग है (क्योंकि बैच फ़ाइलों में %0- %9) है, इसलिए आपको %वहां डबल करना होगा। कमांड लाइन पर यह आवश्यक नहीं है, इसलिए चर के लिए बस हैं %X


1
मुझे आपका दृष्टिकोण पसंद है लेकिन यह और भी बेहतर होगा यदि आप पूर्ण संस्करण प्रदान कर सकते हैं, तो वह जो इसके लिए पैठ का उपयोग करता है।
सोरिन

4
XP के लिए आपको लूप स्क्रिप्ट की आवश्यकता होती है (या आरके से कहां से डाउनलोड करें)। विस्टा और 7 जहाजों के साथ where.exe। मुझे पता है कि ओपी ने विशेष रूप से एक्सपी कहा था, लेकिन पोस्टर के लिए सबसे अच्छा जवाब हमेशा उपयोग करना है where myExecutable
रेयान बेमरोस

रयान: हुह? मुझे नहीं लगता कि मैं आपकी सजा सुना सकता हूं।
जॉय

2
मैं एक बैच स्क्रिप्टिंग शुरुआत कर रहा हूं और यह निश्चित नहीं हूं कि %% x का क्या अर्थ है। मेरे विंडोज 7 सिस्टम पर मैंने टाइप करने की कोशिश की: %% X के लिए (myExecutable.exe) करना (सेट करें = %% ~ $ PATH: X) और फिर वापस लौटा। मुझे यह जवाब मिला: C: \ Users \ James> %% X के लिए% (cmd.exe) करते हैं (सेट करें FOUND = %% ~ $ PATH: X) %% X इस समय अप्रत्याशित था।
7

3
simengineer: बैच फ़ाइलों में और कमांड लाइन पर पार्स करना अलग है (क्योंकि बैच फ़ाइलों में %0- %9) है, इसलिए आपको %वहाँ डबल करना होगा। कमांड लाइन पर यह आवश्यक नहीं है, इसलिए forचर बस हैं %x
जॉय

82

विंडोज विस्टा और बाद के संस्करणों को एक प्रोग्राम के साथ शिप किया जाता where.exeहै जो पथ में प्रोग्राम की खोज करता है। यह इस तरह काम करता है:

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

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

बैच फ़ाइल में उपयोग के लिए आप /qस्विच का उपयोग कर सकते हैं , जो बस सेट ERRORLEVELकरता है और किसी भी आउटपुट का उत्पादन नहीं करता है।

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

या एक सरल (लेकिन कम पठनीय) शॉर्टहैंड संस्करण जो संदेश प्रिंट करता है और आपके ऐप को बाहर निकालता है:

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

बहुत अच्छा और सरल! धन्यवाद!
पावेल कियोच

18

यहां एक सरल समाधान है जो एप्लिकेशन को चलाने का प्रयास करता है और बाद में किसी भी त्रुटि को संभालता है ।

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

त्रुटि कोड 9009 का अर्थ आमतौर पर फ़ाइल नहीं मिला है।

केवल नकारात्मक पक्ष यह है कि file.exeवास्तव में निष्पादित किया जाता है यदि पाया जाता है (जो कुछ मामलों में वांछनीय नहीं है)।


24
केवल नकारात्मक पक्ष यह है कि "file.exe" निष्पादित किया जाता है (जो कुछ मामलों में अवांछित है)
eadmaster

6

यह पैरामीटर प्रतिस्थापन के माध्यम से पूरा किया जा सकता है।

%~$PATH:1

यह निष्पादन योग्य फ़ाइलनाम का पूर्ण पथ% 1 में देता है, अन्यथा रिक्त स्ट्रिंग।

यह उपयोगकर्ता द्वारा परिभाषित चर के साथ काम नहीं करता है। इसलिए यदि निष्पादन योग्य फ़ाइल नाम आपकी स्क्रिप्ट का पैरामीटर नहीं है, तो आपको एक सबरूटीन की आवश्यकता है। उदाहरण के लिए:

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

goto :eof

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

Http://ss64.com/nt/syntax-args.html देखें


1
के साथ दिलचस्प चाल setlocalलेकिन for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)एक लाइन समाधान के साथ forप्रयोग किया जाता है के रूप में इस्तेमाल %%~$PATH:Xसे बचने के लिए callऔर %~$PATH:1
गवेंको

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में काम करने के लिए पर्याप्त नहीं है के रूप में सामग्री को पार्स नहीं करेंगे PATH। उदाहरण के लिए, यह रिक्त स्थान के साथ निर्देशिकाओं को याद करेगा। और यहां तक ​​कि जब आप इसके for /fसाथ उपयोग करते हैं तो delims=;यह सही ढंग से काम नहीं करेगा यदि निर्देशिका में ए ;और उद्धृत है।
जॉय

@ जॉय, स्ट्रिंग प्रतिस्थापन के बारे में कैसे? बदलें ;के साथ "; ": set quotedPath="%PATH:;="; "%"
XP1

1
XP1: नहींं, फिर भी बेकार। इसे "C:\Folder with; semicolon, quoted"रास्ते से जोड़कर देखें और देखें कि क्या होता है। कम से कम यहां यह हर »शब्द का इलाज करने की कोशिश करता है« अलग, जो एक तरह से पहले के व्यवहार से भी बदतर है।
जॉय

0

कभी-कभी यह सरल समाधान काम करता है, जहां आप यह देखने के लिए जांचते हैं कि क्या आउटपुट आपकी अपेक्षा से मेल खाता है। पहली पंक्ति कमांड को चलाती है और मानक आउटपुट की अंतिम पंक्ति को पकड़ लेती है।

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

लेकिन क्या होगा अगर सिस्टम वातावरण एक अन्य भाषा का उपयोग करता है?
समुद्र तट

0

यदि आप स्टार्टअप फ़ोल्डर में मेरे जैसा कुछ खोज रहे हैं, तो फ़ोल्डर जाना चाहिए। उदाहरण के लिए, मैं स्टार्टअप फ़ोल्डर पर exe खोजता हूं और मैं इस कोड का उपयोग करता हूं

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

लेकिन यह पूर्ण PATH में program.exeमौजूद है, यदि केवल एक फ़ोल्डर में ही नहीं
Jeb

-1

कमांड का उपयोग करें: पॉज़शेल टेस्ट-पाथ "exe जो आप खोज रहे हैं"

यह सच है अगर इसके वर्तमान है, अन्यथा झूठी।


यह काम नहीं करेगा। Test-Pathकेवल निर्दिष्ट पथ की जाँच करता है, अर्थात वर्तमान निर्देशिका में होने पर Test-Path nuget.exeही वापस लौटेगा nuget.exe। यदि nuget.exe वर्तमान निर्देशिका में नहीं है, तो वह झूठी वापस आ जाएगी, भले ही वह PATH चर में सूचीबद्ध निर्देशिका में हो। PowerShell में Get-Commandबेहतर कार्य हो सकता है ( stackoverflow.com/questions/11242368/… ), लेकिन ध्यान रखें कि PowerShell के लिए वर्तमान निर्देशिका पथ में नहीं है।
रोनाल्ड ज़रीट्स

1
जैसा कि @RonaldZarits ने बताया, पूर्ण PowerShell समर्थन के लिए, आप दो विकल्पों के साथ Get-Command का उपयोग कर सकते हैं। पहले वर्तमान dir स्थान दें, फिर केवल exe नाम दें। (Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $nullस्थानीय या पथ में पाए जाने पर सही लौटेगा।
जॉन सी

-1

एक PowerShell विकल्प की तलाश करने वालों के लिए। आप Get-Commandदो आइटम पास करने वाले cmdlet का उपयोग कर सकते हैं । पहले .\उपसर्ग के साथ वर्तमान dir स्थान दें, फिर केवल exe नाम दें।

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

यदि स्थानीय या सिस्टम विस्तृत रास्तों में पाया जाता है तो यह सही होगा।


उपयोगकर्ताओं को डाउनवोट और रन करने से बेहतर कुछ भी नहीं है। यदि आप असहमत हैं और उतने ही नीचे जाने वाले हैं, तो अपनी टिप्पणी देने के लिए एक टिप्पणी भी जोड़ें कि आप क्यों असहमत हैं कि यह वांछित परिणाम प्राप्त करने का एक अच्छा तरीका नहीं है।
जॉन सी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.