मैं एक साधारण तरीके से परीक्षण करने के लिए देख रहा हूं कि क्या एक निष्पादन योग्य विंडोज बैच फ़ाइल से पाथ पर्यावरण चर में मौजूद है।
ओएस द्वारा प्रदान नहीं किए गए बाहरी उपकरणों के उपयोग की अनुमति नहीं है। आवश्यक न्यूनतम Windows संस्करण Windows XP है।
मैं एक साधारण तरीके से परीक्षण करने के लिए देख रहा हूं कि क्या एक निष्पादन योग्य विंडोज बैच फ़ाइल से पाथ पर्यावरण चर में मौजूद है।
ओएस द्वारा प्रदान नहीं किए गए बाहरी उपकरणों के उपयोग की अनुमति नहीं है। आवश्यक न्यूनतम Windows संस्करण Windows XP है।
जवाबों:
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
।
where myExecutable
।
%0
- %9
) है, इसलिए आपको %
वहाँ डबल करना होगा। कमांड लाइन पर यह आवश्यक नहीं है, इसलिए for
चर बस हैं %x
।
विंडोज विस्टा और बाद के संस्करणों को एक प्रोग्राम के साथ शिप किया जाता 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
यहां एक सरल समाधान है जो एप्लिकेशन को चलाने का प्रयास करता है और बाद में किसी भी त्रुटि को संभालता है ।
file.exe /? 2> NUL
IF NOT %ERRORLEVEL%==9009 ECHO file.exe exists in path
त्रुटि कोड 9009 का अर्थ आमतौर पर फ़ाइल नहीं मिला है।
केवल नकारात्मक पक्ष यह है कि file.exe
वास्तव में निष्पादित किया जाता है यदि पाया जाता है (जो कुछ मामलों में वांछनीय नहीं है)।
यह पैरामीटर प्रतिस्थापन के माध्यम से पूरा किया जा सकता है।
%~$PATH:1
यह निष्पादन योग्य फ़ाइलनाम का पूर्ण पथ% 1 में देता है, अन्यथा रिक्त स्ट्रिंग।
यह उपयोगकर्ता द्वारा परिभाषित चर के साथ काम नहीं करता है। इसलिए यदि निष्पादन योग्य फ़ाइल नाम आपकी स्क्रिप्ट का पैरामीटर नहीं है, तो आपको एक सबरूटीन की आवश्यकता है। उदाहरण के लिए:
call :s_which app.exe
if not "%_path%" == "" (
"%_path%"
)
goto :eof
:s_which
setlocal
endlocal & set _path=%~$PATH:1
goto :eof
setlocal
लेकिन for %%X in (myExecutable.exe) do (set FOUND=%%~$PATH:X)
एक लाइन समाधान के साथ for
प्रयोग किया जाता है के रूप में इस्तेमाल %%~$PATH:X
से बचने के लिए call
और %~$PATH:1
।
@echo off
set found=
set prog=cmd.exe
for %%i in (%path%) do if exist %%i\%prog% set found=%%i
echo "%found%"
if "%found%"=="" ....
for
में काम करने के लिए पर्याप्त नहीं है के रूप में सामग्री को पार्स नहीं करेंगे PATH
। उदाहरण के लिए, यह रिक्त स्थान के साथ निर्देशिकाओं को याद करेगा। और यहां तक कि जब आप इसके for /f
साथ उपयोग करते हैं तो delims=;
यह सही ढंग से काम नहीं करेगा यदि निर्देशिका में ए ;
और उद्धृत है।
;
के साथ "; "
: set quotedPath="%PATH:;="; "%"
।
"C:\Folder with; semicolon, quoted"
रास्ते से जोड़कर देखें और देखें कि क्या होता है। कम से कम यहां यह हर »शब्द का इलाज करने की कोशिश करता है« अलग, जो एक तरह से पहले के व्यवहार से भी बदतर है।
कभी-कभी यह सरल समाधान काम करता है, जहां आप यह देखने के लिए जांचते हैं कि क्या आउटपुट आपकी अपेक्षा से मेल खाता है। पहली पंक्ति कमांड को चलाती है और मानक आउटपुट की अंतिम पंक्ति को पकड़ लेती है।
FOR /F "tokens=*" %%i in (' "xcopy /? 2> nul" ') do SET xcopyoutput=%%i
if "%xcopyoutput%"=="" echo xcopy not in path.
यदि आप स्टार्टअप फ़ोल्डर में मेरे जैसा कुछ खोज रहे हैं, तो फ़ोल्डर जाना चाहिए। उदाहरण के लिए, मैं स्टार्टअप फ़ोल्डर पर 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!
)
program.exe
मौजूद है, यदि केवल एक फ़ोल्डर में ही नहीं
कमांड का उपयोग करें: पॉज़शेल टेस्ट-पाथ "exe जो आप खोज रहे हैं"
यह सच है अगर इसके वर्तमान है, अन्यथा झूठी।
Test-Path
केवल निर्दिष्ट पथ की जाँच करता है, अर्थात वर्तमान निर्देशिका में होने पर Test-Path nuget.exe
ही वापस लौटेगा nuget.exe
। यदि nuget.exe वर्तमान निर्देशिका में नहीं है, तो वह झूठी वापस आ जाएगी, भले ही वह PATH चर में सूचीबद्ध निर्देशिका में हो। PowerShell में Get-Command
बेहतर कार्य हो सकता है ( stackoverflow.com/questions/11242368/… ), लेकिन ध्यान रखें कि PowerShell के लिए वर्तमान निर्देशिका पथ में नहीं है।
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
स्थानीय या पथ में पाए जाने पर सही लौटेगा।
एक PowerShell विकल्प की तलाश करने वालों के लिए। आप Get-Command
दो आइटम पास करने वाले cmdlet का उपयोग कर सकते हैं । पहले .\
उपसर्ग के साथ वर्तमान dir स्थान दें, फिर केवल exe नाम दें।
(Get-Command ".\notepad", "notepad" -ErrorAction Ignore -CommandType Application) -ne $null
यदि स्थानीय या सिस्टम विस्तृत रास्तों में पाया जाता है तो यह सही होगा।