बैच फ़ाइल को शुरू / कॉल करते समय एक तर्क को परिभाषित करने पर मैं कैसे जांच कर सकता हूं?


96

मैं एक बैच फ़ाइल में निम्नलिखित सत्यापन तर्क का उपयोग करने की कोशिश कर रहा हूं, लेकिन "उपयोग" ब्लॉक कभी भी निष्पादित नहीं करता है जब बैच फ़ाइल में कोई पैरामीटर नहीं दिया जाता है।

if ("%1"=="") goto usage

@echo This should not execute

@echo Done.
goto :eof

:usage
@echo Usage: %0 <EnvironmentName>
exit 1

मैं क्या गलत कर रहा हूं?


जवाबों:


146

एक कमांडलाइन तर्क सेट किया गया है या नहीं, इसके लिए चेक [%1]==[], जैसा कि डेव कोस्टा बताते हैं , "%1"==""यह भी काम करेगा।

मैंने अधिक से अधिक और कम संकेतों से बचने के लिए उपयोग प्रतिध्वनि में एक वाक्यविन्यास त्रुटि भी तय की। इसके अलावा, exitएक /Bतर्क की जरूरत है अन्यथा CMD.exeछोड़ देंगे।

@echo off

if [%1]==[] goto usage
@echo This should not execute
@echo Done.
goto :eof
:usage
@echo Usage: %0 ^<EnvironmentName^>
exit /B 1

18
[% 1] == [] "% 1" == "" से बेहतर है क्योंकि यह उस मामले को सही ढंग से संभालेगा जहां% 1 खुद दोहरे उद्धरण चिह्नों का है। "% 1" == "" इस समय "अप्रत्याशित" संदेश के साथ त्रुटि होगी।
टेकुमारा

2
ध्यान दें कि, यदि आप कमांडलाइन तर्कों का उपयोग नहीं कर रहे हैं, लेकिन setचर (मुझे सही बैच शब्दावली नहीं पता है), तो आप उपयोग करना चाह सकते हैं "%myvar%"==""क्योंकि यदि myvarइसमें रिक्त स्थान हैं और उद्धृत नहीं किया गया है, तो आपको इस समय "अप्रत्याशित" मिलेगा " संदेश।
पैट

1
@Pat SET वेरिएबल्स को IF NOT DEFINED VarNameब्लॉक से चेक किया जा सकता है । इसके अलावा +1 से तुकशन की तुलना में उद्धरणों का उपयोग नहीं करने के लिए। बस यह मत करो। कभी नहीँ।
Fr0sT

10
"%~1"==""काम भी करेगा और उस मामले का ध्यान रखेगा जहाँ% 1 में दोहरे उद्धरण हैं
Drakkim

8
"%~1"==""[]संस्करण में रिक्त स्थान को संभालता है जबकि संस्करण नहीं है।
कुकी बटर

17

एक और अधिक उन्नत उदाहरण:

Ments असीमित तर्क।

⍟ फाइल सिस्टम (या तो पर मौजूद हैं fileया directory?) या एक सामान्य string

⍟ निर्दिष्ट करें कि क्या फ़ाइल है

⍟ निर्दिष्ट एक निर्देशिका है

कोई एक्सटेंशन, विरासत लिपियों में काम करेगा!

न्यूनतम कोड ☺

@ तो बंद

: पाश
      :: -------------------------- तर्क है?
      अगर ["% ~ 1"] == [""] (
        प्रतिध्वनि हुई।
        गोटो अंत
      )
      :: -------------------------- तर्क मौजूद है?
      यदि% s1 मौजूद नहीं है (
        गूंज मौजूद नहीं है
      ) अन्य (
        प्रतिध्वनि मौजूद है
        यदि% ~ s1 \ NUL मौजूद है (
          गूंज एक निर्देशिका है
        ) अन्य (
          इको एक फाइल है
        )
      )
      :: --------------------------
      खिसक जाना
      गोटो लूप
      
      
:समाप्त

ठहराव

✨ अन्य सामान..✨

■ में %~1- ~किसी भी लपेट को हटा देता है "या '

■ में %~s1- sपथ बनाता है DOS 8.3 naming, जो सामान की जाँच करते समय फ़ाइल-नाम में रिक्त स्थान से बचने के लिए एक अच्छी चाल है (और इस तरह से अधिक "एस के साथ संसाधन को लपेटने की कोई आवश्यकता नहीं है ।

["%~1"]==[""]"यदि यह सुनिश्चित नहीं किया जा सकता" ■ यदि तर्क एक फ़ाइल / निर्देशिका या अभी तक एक सामान्य स्ट्रिंग है, तो इसके बजाय अभिव्यक्ति कोष्ठक और मूल अनमॉडिफ़ाइड का उपयोग करता है %1(बस "रैपिंग के बिना , यदि कोई हो ..)

अगर हमारे द्वारा उपयोग किए गए कोई तर्क नहीं थे shiftऔर arg-list सूचक पिछले एक को पारित कर चुका है, तो अभिव्यक्ति का मूल्यांकन किया जाएगा [""]==[""]

■ यह उतना ही विशिष्ट है जितना आप अधिक तरकीबों का उपयोग किए बिना कर सकते हैं (यह विंडोज़ -95 की बैच-स्क्रिप्ट में भी काम करेगा ...)

■ निष्पादन उदाहरण

इसे के रूप में सहेजें identifier.cmd

यह एक असीमित तर्कों की पहचान कर सकता है (आम तौर पर आप %1- तक सीमित हैं %9), बस उल्टे-अल्पविरामों के साथ तर्कों को लपेटने के लिए याद रखें, या 8.3 नामकरण का उपयोग करें, या उन्हें ऊपर खींचें (इसे स्वचालित रूप से या तो ऊपर करता है)।


यह आपको निम्नलिखित कमांड चलाने की अनुमति देता है:

Get identifier.cmd c:\windows और पाने के लिए

मौजूद
एक निर्देशिका है
किया हुआ

Get identifier.cmd "c:\Program Files (x86)\Microsoft Office\OFFICE11\WINWORD.EXE" और पाने के लिए

मौजूद
एक फाइल है
किया हुआ

Ments और कई तर्क (बेशक यह पूरी डील है ..)

identifier.cmd c:\windows\system32 c:\hiberfil.sys "c:\pagefile.sys" hello-world

और पाने के लिए

मौजूद
एक निर्देशिका है
मौजूद
एक फाइल है
मौजूद
एक फाइल है
मौजूद नहीं
किया हुआ।

स्वाभाविक रूप से यह बहुत अधिक जटिल हो सकता है, लेकिन अच्छे उदाहरण हमेशा सरल और न्यूनतम होने चाहिए। :)

आशा है कि यह किसी को भी मदद करता है :)

यहाँ प्रकाशित: सीएमडी निंजा - असीमित तर्क प्रसंस्करण, फ़ाइल-सिस्टम में मौजूद है, यदि फ़ाइल या निर्देशिका की पहचान करना

और यहाँ एक कार्यशील उदाहरण है जो एपीके फ़ाइलों (एंड्रॉइड ऐप) की किसी भी राशि को लेता है और उन्हें आपके डिवाइस पर डिबग-कंसोल (ADB.exe) के माध्यम से इंस्टॉल करता है: पिछले पोस्ट को एक बड़े पैमाने पर एपीके APK इंस्टालर बनाएं जो एडीबी इंस्टॉल-मल्टी सिंटैक्स का उपयोग नहीं करता है


14

कोष्ठक से छुटकारा।

नमूना बैच फ़ाइल:

echo "%1"

if ("%1"=="") echo match1

if "%1"=="" echo match2

स्क्रिप्ट से ऊपर चलने से आउटपुट:

C:\>echo "" 
""

C:\>if ("" == "") echo match1 

C:\>if "" == "" echo match2 
match2

मुझे लगता है कि यह वास्तव में कोष्ठकों को तार का हिस्सा बनने के लिए ले जा रहा है और उनकी तुलना की जा रही है।


1
if "%1"==""दुर्घटना होगी अगर arg रिक्त स्थान है। उदाहरण के लिए run.bat "a b":। @amr का उपयोग करने के लिए सबसे अच्छा जवाब हैif "%~1"==""
समझदार

6
IF "%~1"=="" GOTO :Usage

~ डी-उद्धरण% 1 यदि% 1 स्वयं उद्धृत है।

"" पारित किए गए विशेष पात्रों से रक्षा करेगा। उदाहरण के लिए & पिंग के साथ स्क्रिप्ट को कॉल करना


1
यह सबसे अच्छा जवाब है। अन्य उत्तर कुछ मामलों के लिए काम करते हैं, लेकिन अधिक विशेष मामलों के लिए असफल हो जाएंगे जैसेrun.bat "a b"
समझदार

@wisbucky स्वीकार किए गए उत्तर को गड़बड़ नहीं करता है । मैं क्या खो रहा हूँ?
रफिन

@ruffin, उदाहरण: के run.bat ""साथ पकड़ा नहीं जाएगा [%1]==[]
वारबैंक


2

यह अन्य उत्तरों के समान ही है, लेकिन केवल एक लेबल का उपयोग करता है और उपयोग को पहले रखता है, जो इसके अतिरिक्त इसे स्क्रिप्ट के एक प्रकार के प्रलेखन की सराहना करता है, जिसे आमतौर पर शीर्ष पर भी रखा जाता है:

@echo off
:: add other test for the arguments here...
if not [%1]==[] goto main
:: --------------------------
echo This command does something.
echo.
echo %0 param%%1 param%%2
echo       param%%1 the file to operate on
echo       param%%1 another file

:: --------------------------
exit /B 1

:main
:: --------------------------
echo do something with all arguments (%%* == %*) here...

हालाँकि, यदि आपको cmd / बैच का उपयोग करने की आवश्यकता नहीं है, तो WSL या पॉवरशेल पर बैश का उपयोग करें, उनके पास अधिक सिन सिंटैक्स और कम आर्कन सुविधाएँ हैं।


0

यदि "% 1" == "" विफल हो जाएगा, तो इसके सभी संस्करण कुछ विष चरित्र स्थितियों के तहत विफल हो जाएंगे। केवल अगर सुरक्षित या सुरक्षित नहीं है तो सुरक्षित है


if [not] defined ...जैसे मापदंडों के साथ काम नहीं करता है %1। क्या आपके पास एक उदाहरण है, जहां if "%~1" ...काम नहीं करता है?
Stephan
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.