यह निर्धारित करें कि कमांड को बैच फ़ाइल में पहचाना गया है या नहीं


43

मैं एक बैट स्क्रिप्ट लिख रहा हूं जिसमें मैं एक प्रोग्राम (जैसे जेवैक) का आह्वान करता हूं। सादगी के लिए, मैं यह जांचना चाहता हूं कि क्या कमांड चलने से पहले मौजूद है। यानी यदि PATH में कमांड मौजूद है।

उदाहरण के लिए,

if (my_command.exe is a recognized command) then (
  my_command.exe my_args
) else (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file."
  REM Do not run my_command.exe
)

विंडोज में ऐसा करने का सबसे अच्छा तरीका क्या है?


आप अपने आदेश को "कैसे" पहचानेंगे?
रूक

एमएस-डॉस (सच्चा डॉस) में यह सरल नहीं था; आपने अभी c: \ dos में एक exe फ़ाइल के अस्तित्व की जाँच की; लेकिन फिर भी सवाल बना हुआ है।
रुके

गलतफहमी के लिए खेद है। मेरा मतलब अनिवार्य रूप से विंडोज में कमांड प्रॉम्प्ट था। अगर मैं "lkajsflksajdfj" टाइप करता हूं, तो मैं यह पता लगाना चाहता हूं कि यह कमांड नहीं है। यदि मैं "notepad.exe" टाइप करता हूं, तो यह ठीक है।
user46097

जवाबों:


54
WHERE mycommand
IF %ERRORLEVEL% NEQ 0 ECHO mycommand wasn't found 

10
अगर किसी को cmd विंडो के अंदर आउटपुट नहीं चाहिए, तो बस >nul 2>nulपीछे जोड़ें mycommand
सेबस्टियन

ध्यान दें कि 1 और 2 से अधिक आउटपुट चैनल हैं, क्योंकि 1 आउटपुट बफर के लिए और 2 त्रुटि बफर के लिए खड़ा है, यह निर्भर करता है कि एप्लिकेशन को कैसे विकसित किया गया था, यह विंडोज के साथ काम करने वाले सामान्य ऐप के लिए काम करना चाहिए, लेकिन एक विशिष्ट सीएलआई कार्यक्रम हो सकता है। अभी भी पाठ फेंक रहा है जब चैनल 1 और 2 को पुनर्निर्देशित किया गया है।
06:26 पर ElektroStudios

15

नीचे दिए गए कोड को हमेशा बिना कचरे के आउटपुट के साथ सफाई से निष्पादित करना चाहिए।

javac -version >nul 2>&1 && (
    echo found javac
) || (
    echo fail
)

आउटपुट:

found javac

एक-लाइनर के समान कोड:

javaz -version >nul 2>&1 && ( echo found javac ) || ( echo fail )

आउटपुट:

fail

ध्यान दें कि आदेश &&और ||मामला लगता है। साथ ही, वह कमांड जिसके अस्तित्व के लिए आप परीक्षण कर रहे हैं, उसे इस कार्य के लिए एक त्रुटिपूर्ण <= 0 के साथ लौटना होगा। उम्मीद है कि कमांड / है? या --help तर्क या, जावा के साथ, एक संस्करण जानकारी कमांड।


यह समाधान एकदम सही है!
robe007

7

सबसे आसान तरीका यह है कि आप केवल कमांड को चला सकते हैं, लेकिन इसमें अन्य समस्याएं हैं, निश्चित रूप से, क्योंकि आप एक यादृच्छिक प्रक्रिया शुरू नहीं करना चाहते हैं।

for %%x in (my_command.exe) do if not [%%~$PATH:x]==[] set MyCommandFound=1

एक विकल्प है जो %PATH%पर्यावरण चर द्वारा सूचीबद्ध पथों में कार्यक्रम की खोज करता है। यह अनिवार्य रूप से एक शुद्ध बैच संस्करण है which(1)। इसे बेहतर बनाया जा सकता है लेकिन अनिवार्य रूप से यह यही है।


1
यह सही है, वास्तव में क्या पूछा गया था!
Pez Cuckow

3

मेरी स्थिति के लिए। पूर्ण सरलतम तरीका उपयोग कर रहा है || या && ऑपरेटर।

my_command.exe -version 2>NUL && echo "my_command exists"

या

my_command.exe -version 2>NUL || echo "my_command doesn't exist"

आप स्टडआउट को पुनर्निर्देशित क्यों नहीं करते?
जॉय

3

नीचे दिए गए संस्करण के लिए कुछ परिशोधन। परीक्षण करें कि कमांड मौजूद है और अनावश्यक आउटपुट को दबाएं।

WHERE scp >nul 2>nul
IF %ERRORLEVEL% EQU 0 ECHO scp found

जहाँ <my_exe> NUL 2> & 1 || echo my.exe मौजूद नहीं है && गोटो: EOF लिपियों में अच्छी तरह से काम करता है
रॉबर्ट

एनबी: यह काम नहीं करता है यदि फ़ाइल नाम जिसे आप परीक्षण करना चाहते हैं, उसमें पथ जानकारी शामिल है। जैसे, WHERE \Windows\System32\cmd.exe=>INFO: Could not find files for the given pattern(s).
जोनाथन गिल्बर्ट

1

यदि अतिरिक्त टूल की स्थापना की आवश्यकता है तो ठीक है, whereसंसाधन किट में एक कमांड है; Windows को किसके समतुल्य देखें ?

अन्यथा, विंडोज के संस्करणों के लिए जो बहुत प्राचीन नहीं हैं, यह शुद्ध cmdमें उल्लेखनीय है, जैसा कि पाथ को छोड़कर डॉस निष्पादन योग्य लुकअप में वर्णित है ।


रिपीटी के लिए धन्यवाद! दुर्भाग्य से, आवश्यकताओं में से एक यह है कि इसे एक वेनिला बॉक्स (एक्सपी मशीन शामिल) पर चलना है - इसलिए जहां कोई विकल्प नहीं है।
user46097

2
दूसरे लिंक गाइल्स ने एक निफ्टी समाधान दिया है जो किसी अतिरिक्त उपकरण के लिए उपयोग करता है।
विरोधाभास

1

मुझे पता है कि यह वह नहीं है जो आप खोज रहे हैं, लेकिन तर्क में थोड़े बदलाव के साथ इसे पूरा करना चाहिए जो आपको चाहिए।

चलाए जाने वाले प्रत्येक कमांड में एक रिटर्न कोड (उर्फ एररलेवल) होता है, अगर रिटर्न कोड 0 (शून्य) है, कमांड सफलतापूर्वक चला है, यदि रिटर्न कोड 0 से अधिक है, तो कुछ गलत हो गया है।

अधिक जानकारी के लिए यहां देखें ।

कुछ इस तरह -

my_command
if (%ERRORLEVEL% > 0) then (
  REM Output was probably "'my_command.exe' is not recognized as an internal or external command, operable program or batch file.  OR SOMETHING WENT WRONG WITH IT."
  REM Do not run my_command.exe
)

यह चतुर है, मुझे यह पसंद है।
शिन्राई

हाँ, लेकिन इसकी बदसूरत तब से, अगर कमांड नहीं मिली है तो यह 2 लाइन की त्रुटि फेंकता है। तो, एक क्लीनर समाधान संभवतः पाया जा सकता है।
djangofan

0

जबकि उन सभी तरह से काम हो सकता है, क्यों नहीं बनाया गया है?

If exists my_command do echo "my_command exists"

भागो "अगर /?" विवरण के लिए कमांड लाइन पर


5
यह केवल यह देखेगा कि वर्तमान निर्देशिका में उस नाम वाली फ़ाइल / निर्देशिका मौजूद है या नहीं। यह एक संकेत के बहुत प्रदान नहीं करता है कि क्या उस नाम के साथ एक चल कमान मौजूद है क्योंकि यह निर्धारित करने के लिए कि आपको खोज करना होगा PATH
जॉय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.