यदि बैच फ़ाइल में कोई पैरामीटर खाली है, तो परीक्षण करने का उचित तरीका क्या है?


213

मुझे यह परखने की जरूरत है कि कोई चर निर्धारित है या नहीं। मैंने कई तकनीकों की कोशिश की है, लेकिन जब भी %1मामला होता %1है, तब वे उद्धरणों से घिरे हुए लगते हैं "c:\some path with spaces"

IF NOT %1 GOTO MyLabel // This is invalid syntax
IF "%1" == "" GOTO MyLabel // Works unless %1 has double quotes which fatally kills bat execution
IF %1 == GOTO MyLabel // Gives an unexpected GOTO error.

इस साइट के अनुसार , ये समर्थित IFसिंटैक्स प्रकार हैं। इसलिए, मुझे यह करने का कोई तरीका नहीं दिख रहा है।

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

1
मेरे सिस्टम पर (विंडोज 2003 के साथ-साथ विंडोज 7), if "%1" == "" GOTO MyLabelस्क्रिप्ट के निष्पादन को वस्तुतः तब तक नहीं मारता, जब तक कि %1दोहरे कोट्स की संख्या न हो। मैं देखता हूं कि %1इस त्रुटि के साथ स्क्रिप्ट के निष्पादन में विषम संख्या में दोहरे उद्धरण हैं : The syntax of the command is incorrect.समस्या को हल करने के लिए वर्ग कोष्ठक का उपयोग करने वाले नीचे दिए गए समाधान को सही उत्तर के रूप में चिह्नित किया गया है, लेकिन यह किसी भी बेहतर नहीं लगता है । जब %1दो-उद्धरणों की विषम संख्या होती है, तो यह समाधान भी उसी त्रुटि के साथ विफल हो जाता है।
सुषम पाल

@SusamPal दिलचस्प। इसके तहत कोष्ठक संस्करण का प्रयास करें और देखें कि क्या काम करता है। यह कि मैंने और परीक्षण किया। मैंने अभी कुछ दिन पहले स्वीकृत उत्तर को अपडेट किया है।
blak3r

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

एक अच्छा "कैच ऑल" उदाहरण: stackoverflow.com/questions/830565/… दोनों फ़ाइल / डायरेक्टरी और जेनेरिक स्ट्रिंग / नंबर मिक्स को तर्क में शामिल करता है।

इतना निराशाजनक - IF DEFINEDकेवल स्क्रिप्ट चर के बजाय पर्यावरण चर पर काम करना इस तरह की क्षमता की बर्बादी है!
kayleeFrye_onDeck

जवाबों:


290

उद्धरण चिह्नों के बजाय चौकोर कोष्ठक का प्रयोग करें:

IF [%1] == [] GOTO MyLabel

कोष्ठक असुरक्षित हैं : केवल वर्ग कोष्ठक का उपयोग करें।


11
कोष्ठक सुरक्षित नहीं हैं! की तरह सामग्री &में %1लाइन टूट जाएगा
जेब

14
अन्य वर्णों का उपयोग करना if #%1#==##या if [%1]==[]ऐसा करना अच्छा है जब तक कि तर्क में कोई स्थान न हो, अन्यथा आपको एक …was unexpected at this timeत्रुटि मिलेगी ।
Synetech

12
और उपयोग "%~1"करना वास्तव में एक बेहतर दृष्टिकोण है, जैसा कि मैंने अपने उत्तर में उल्लेख किया है।
jamesdlin

8
दोस्तों, @jamesdlin सही है। यदि चर पाठ में स्थान है या है, तो यह दृष्टिकोण काम नहीं करेगा ==। उसके जवाब का उपयोग करें।
जेम्स को

4
आप इसे स्पष्ट नहीं करते हैं it DOES NOT work with spaces। इसके बजाय @jamesdlin उत्तर का उपयोग करें।
जेबी मोनिका के साथ।

153

आप उपयोग कर सकते हैं:

IF "%~1" == "" GOTO MyLabel

उद्धरण के बाहरी सेट को पट्टी करने के लिए। सामान्य तौर पर, यह वर्ग कोष्ठक का उपयोग करने की तुलना में अधिक विश्वसनीय तरीका है क्योंकि यह तब भी काम करेगा जब चर में रिक्त स्थान हो।


9
यह वास्तव में इसे करने का एक अच्छा तरीका है। उपयोग करके ~, आप बाहरी उद्धरणों को छाँटते हैं यदि वे मौजूद हैं, लेकिन फिर उन्हें मैन्युअल रूप से वापस जोड़ें (केवल एक सेट सुनिश्चित करें)। इसके अलावा, आप है उद्धरण चिह्नों का उपयोग करने के लिए करता है, तो तर्क रिक्ति (मैं इस मुश्किल तरीके से उपयोग करते समय की मेरी पिछले संस्करण सीखा #या उद्धरण के बजाय कोष्ठक रिक्त स्थान के साथ की वजह से तर्क एक फेंक …was unexpected at this timeत्रुटि।)
Synetech

4
क्या यह% 1 जैसे तर्कों के बजाय% MYVAR% जैसे सामान्य चर के लिए भी लागू है?
19

4
@simpleuser ओह, आप सही कह रहे हैं, यह सामान्य पर्यावरण चर के साथ काम नहीं करता है।
jamesdlin

1
भागने के अनुक्रम के रूप में डबल '' '' का उपयोग करने वाले स्ट्रिंग्स के लिए देखें - तुलना के प्रयास के दौरान स्क्रिप्ट क्रैश हो जाएगी। उदाहरण के लिए ""this string will crash the comparison""। डबल '' '' उचित भागने का क्रम है, और डबल '' '' पर प्रतिस्थापन करने से विफल हो जाएगा। स्ट्रिंग खाली है।
Tydaeus

1
@ ऐमलगोविंस आप शायद चर को उप-तर्क के तर्क के रूप में पारित कर सकते हैं और उप-पाठ का उपयोग कर सकते हैं "%~1"
jamesdlin

38

सबसे अच्छा अर्ध समाधानों %1में से एक को एक चर में कॉपी करना और फिर विलंबित एक्सपी के रूप में विलंबित विस्तार का उपयोग करना है। किसी भी सामग्री के खिलाफ हमेशा सुरक्षित है।

set "param1=%~1"
setlocal EnableDelayedExpansion
if "!param1!"=="" ( echo it is empty )
rem ... or use the DEFINED keyword now
if defined param1 echo There is something

इसका फायदा यह है कि परम 1 से निपटना पूरी तरह सुरक्षित है।

और परम 1 की सेटिंग कई मामलों में काम करेगी, जैसे

test.bat hello"this is"a"test
test.bat you^&me

लेकिन यह अभी भी अजीब सामग्री की तरह विफल रहता है

test.bat ^&"&

अस्तित्व के लिए 100% सही उत्तर प्राप्त करने में सक्षम होना

यह पता लगाता है कि %1क्या खाली है, लेकिन कुछ सामग्री के लिए यह सामग्री नहीं ला सकता है।
यह एक खाली %1और एक के बीच अंतर करने के लिए भी उपयोगी हो सकता है ""
यह CALLबैच फ़ाइल को निरस्त किए बिना कमांड की क्षमता का उपयोग करता है ।

@echo off
setlocal EnableDelayedExpansion
set "arg1="
call set "arg1=%%1"

if defined arg1 goto :arg_exists

set "arg1=#"
call set "arg1=%%1"
if "!arg1!" EQU "#" (
    echo arg1 exists, but can't assigned to a variable
    REM Try to fetch it a second time without quotes
    (call set arg1=%%1)
    goto :arg_exists
)

echo arg1 is missing
exit /b

:arg_exists
echo arg1 exists, perhaps the content is '!arg1!'

यदि आप सामग्री लाने के लिए 100% बुलेट प्रूफ होना चाहते हैं, तो आप पढ़ सकते हैं कि कैसे सबसे अजीब कमांड लाइन मापदंडों को भी प्राप्त किया जा सकता है ?


18

IF /? से

यदि कमांड एक्सटेंशन सक्षम हैं, तो निम्नानुसार परिवर्तन:

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

......

परिभाषित सशर्त केवल EXISTS की तरह काम करता है, सिवाय इसके कि यह एक पर्यावरण चर नाम लेता है और अगर पर्यावरण चर परिभाषित किया जाता है तो यह सही है।


1
हां, मैंने वास्तव में इस दृष्टिकोण की कोशिश की और जो मैं यह बता सकता था कि यह केवल पर्यावरणीय चर के साथ काम करता है। इसलिए, बैच फ़ाइल के अंदर% 1 या एक चर के साथ काम नहीं किया।
blak3r

2
वह केवल %1और केवल पसंद के लिए सच है । "बैच फ़ाइल के अंदर परिभाषित चर" वास्तव में पर्यावरण चर हैं, जबकि बैच फ़ाइल चल रही है, और आप उन IF DEFINEDपर उपयोग कर सकते हैं।
zb226

8

दुर्भाग्य से मेरे पास टिप्पणी लिखने या वोट देने के लिए पर्याप्त प्रतिष्ठा नहीं है, मुझे अपना खुद का लिखना होगा।

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

% 1 एक परिवर्तनीय नहीं है! यह एक कम लाइन PARAMETER है।

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

चर सेट कमांड का उपयोग करके सेट किए जाते हैं, और 2 प्रतिशत संकेतों का उपयोग करके याद किया जाता है - एक से पहले और एक के बाद। उदाहरण के लिए% myvar%

एक खाली चर के लिए परीक्षण करने के लिए आप "यदि परिभाषित नहीं हैं" वाक्यविन्यास का उपयोग करते हैं (चर के लिए स्पष्ट रूप से आदेश किसी भी प्रतिशत संकेत की आवश्यकता नहीं है), उदाहरण के लिए:

set myvar1=foo  
if not defined myvar1 echo You won't see this because %myvar1% is defined.  
if not defined myvar2 echo You will see this because %myvar2% isn't defined.

(यदि आप कमांड लाइन मापदंडों का परीक्षण करना चाहते हैं तो मैं jamesdlin के उत्तर का संदर्भ देने की सलाह देता हूं।)


1
तुम सही हो। लेकिन सही तरीका सिर्फ शीर्षक को सही if variable is emptyकरने के लिए होता if parameter is empty। मैंने अभी ये किया। (कुछ उत्तरों को अमान्य करने के जोखिम पर, जो मापदंडों के बजाय चर की जाँच करते थे और इसलिए वैसे भी अमान्य हैं, क्योंकि वे सवाल का जवाब नहीं देते थे)
Stephan

1
ओके थैंक्स स्टीफ़न, एहसास नहीं हुआ कि आप ऐसा कर सकते हैं। मैंने अपडेट को प्रतिबिंबित करने के लिए अपना उत्तर संपादित किया है।
ऑटोमैटीक जूल 27'18

6

बैच फ़ाइल में चर का परीक्षण करने के लिए "IF DEFINED चर कमांड" का उपयोग करें।

लेकिन अगर आप बैच मापदंडों का परीक्षण करना चाहते हैं, तो ट्रिकी इनपुट (जैसे "1 2" या ab ^> cd) से बचने के लिए नीचे दिए गए कोड आज़माएं।

set tmp="%1"
if "%tmp:"=.%"==".." (
    echo empty
) else (
    echo not empty
)

5

मैं नीचे दिए गए कोड के साथ परीक्षण करता हूं और यह ठीक है।

@echo off

set varEmpty=
if not "%varEmpty%"=="" (
    echo varEmpty is not empty
) else (
    echo varEmpty is empty
)
set varNotEmpty=hasValue
if not "%varNotEmpty%"=="" (
    echo varNotEmpty is not empty
) else (
    echo varNotEmpty is empty
)

जब चर में एक उद्धरण होता है तो आपका समाधान विफल हो जाता है। Btw IF DEFINED varएक कारण के लिए वाक्यविन्यास मौजूद है
jeb

4

मैं आमतौर पर इसका उपयोग करता हूं:

IF "%1."=="." GOTO MyLabel

यदि% 1 खाली है, तो IF तुलना करेगा "।" सेवा "।" जो सत्य का मूल्यांकन करेगा।


4
यह गलत है। यह उसी तरह की बात है: यदि "% 1" == "" इस पोस्ट का कारण था यदि% 1 में ही यह विफल रहता है।
मारक

क्या आप परीक्षण करने की कोशिश कर रहे हैं कि क्या% 1 खाली है या यदि इसके उद्धरण हैं? सवाल अस्पष्ट है। मेरा उत्तर कार्य करता है यदि% 1 के लिए कमांड लाइन पर कुछ भी निर्दिष्ट नहीं है।
एफोरिया

> क्या आप परीक्षण करने की कोशिश कर रहे हैं कि क्या% 1 खाली है या यदि उसके पास उद्धरण हैं? @ रूपोरिया, इसे दोनों को संभालने में सक्षम होना चाहिए।
सिंथेट

यदि% 1% सेट किया गया था, तो मेरे लिए अच्छी तरह से काम करने के लिए मैंने इसका उपयोग किया। धन्यवाद, अच्छा जवाब!
चार्ली ए

4

मैंने यहाँ उत्तरों के आधार पर इस छोटे से बैच की लिपि बनाई, क्योंकि इसमें कई मान्य हैं। जब तक आप एक ही प्रारूप का पालन करते हैं, तब तक इसे जोड़ने के लिए स्वतंत्र महसूस करें:

REM Parameter-testing

Setlocal EnableDelayedExpansion EnableExtensions

IF NOT "%~1"=="" (echo Percent Tilde 1 failed with quotes) ELSE (echo SUCCESS)
IF NOT [%~1]==[] (echo Percent Tilde 1 failed with brackets) ELSE (echo SUCCESS)
IF NOT  "%1"=="" (echo Quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1]==[] (echo Brackets one failed) ELSE (echo SUCCESS)
IF NOT "%1."=="." (echo Appended dot quotes one failed) ELSE (echo SUCCESS)
IF NOT [%1.]==[.] (echo Appended dot brackets one failed) ELSE (echo SUCCESS)

pause

4

खाली स्ट्रिंग double-quotes/ की एक जोड़ी है "", हम सिर्फ लंबाई का परीक्षण कर सकते हैं:

set ARG=%1
if not defined ARG goto nomore

set CHAR=%ARG:~2,1%
if defined CHAR goto goon

इसके बाद 2 वर्णों का परीक्षण करें double-quotes:

if ^%ARG:~1,1% == ^" if ^%ARG:~0,1% == ^" goto blank
::else
goto goon

यहां एक बैच स्क्रिप्ट है, जिसके साथ आप खेल सकते हैं। मुझे लगता है कि यह ठीक से खाली स्ट्रिंग को पकड़ता है।

यह सिर्फ एक उदाहरण है, आपको बस अपनी स्क्रिप्ट के अनुसार 2 (या 3?) चरणों को अनुकूलित करने की आवश्यकता है।

@echo off
if not "%OS%"=="Windows_NT" goto EOF
:: I guess we need enableExtensions, CMIIW
setLocal enableExtensions
set i=0
set script=%0

:LOOP
set /a i=%i%+1

set A1=%1
if not defined A1 goto nomore

:: Assumption:
:: Empty string is (exactly) a pair of double-quotes ("")

:: Step out if str length is more than 2
set C3=%A1:~2,1%
if defined C3 goto goon

:: Check the first and second char for double-quotes
:: Any characters will do fine since we test it *literally*
if ^%A1:~1,1% == ^" if ^%A1:~0,1% == ^" goto blank
goto goon

:goon
echo.args[%i%]: [%1]
shift
goto LOOP

:blank
echo.args[%i%]: [%1] is empty string
shift
goto LOOP

:nomore
echo.
echo.command line:
echo.%script% %*

:EOF

यह यातना परीक्षा परिणाम:

.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""
args[1]: [::]
args[2]: [""] is empty string
args[3]: [">"""bl" "]
args[4]: ["< "">"]
args[5]: [(")(")]
args[6]: [""] is empty string
args[7]: [::]
args[8]: [""-"  "]
args[9]: ["( )"">\>"]
args[10]: [""] is empty string

command line:
.test.bat :: ""  ">"""bl" " "< "">"  (")(") "" :: ""-"  " "( )"">\>" ""

यह गलत है, एक खाली स्ट्रिंग दो दोहरे उद्धरणों के साथ एक स्ट्रिंग नहीं ""है एक खाली स्ट्रिंग `` `है और बैच में एक खाली चर एक अपरिभाषित चर है। आप परिभाषित कर सकते हैं, कि आपके तर्कों के लिए बाहरी उद्धरण हटा दिए जाएंगे, लेकिन फिर भी स्ट्रिंग 0
jeb

इस संदर्भ में (cmd तर्क जीतें), आप किसी भी अन्य तरीके के साथ एक रिक्त स्ट्रिंग को निरूपित नहीं कर सकते हैं, दोहरे एकल-उद्धरण के साथ भी नहीं जो कि यूनिक्स शेल के तहत समान रूप से खाली है।
14:68 पर user6801759

हां, ""खाली तारों के लिए भी उपयोग किया जाता है, लेकिन %~1बाहरी उद्धरणों को हटाने के लिए उपयोग करना काफी आसान है । इस तरह के एक जटिल समाधान का उपयोग करने की आवश्यकता नहीं है
जेब

आपने सही कहा, मैं अनुचित रूप से कह सकता हूँ, यह केवल खाली स्ट्रिंग के लिए नहीं, बल्कि तर्कों को गूढ़ करने का एक सुरक्षित तरीका है। अन्य तरीके जैसे कि "%~1"==""तर्क से विफल होंगे जैसे "Long File Name".txtकि एक वैध तर्क है। संपादित करें : और यह निश्चित रूप से जटिल नहीं है जैसा आपने कहा था। परीक्षण के लिए केवल 2 कदम ऊपर, बाकी क्रिया उदाहरण हैं।
user6801759

"अगर एआरजी परिभाषित नहीं है" पूरी तरह से काम करने लगता है (मेरा चर कमांड लाइन से नहीं आता है)
ग्रेफेस

4

आप उपयोग कर सकते हैं

if defined (variable) echo That's defined!
if not defined (variable) echo Nope. Undefined.

1
एसओ में आपका स्वागत है! आपका जवाब सवाल का एक अच्छा जवाब लगता है। एक बार आपके पास पर्याप्त [प्रतिष्ठा] ( stackoverflow.com/help/whats-reputation ) आप किसी भी पोस्ट पर टिप्पणी करने में सक्षम होंगे । इसके अलावा मैं क्या कर सकता हूं इसकी जांच करें ।
Thewaywewere

3

स्क्रिप्ट 1:

इनपुट ("Quotes.cmd निकालें" "यह एक परीक्षण है")

@ECHO OFF

REM Set "string" variable to "first" command line parameter
SET STRING=%1

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

REM IF %1 [or String] is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel


REM   OR   IF "." equals "." GOTO MyLabel
IF "%STRING%." == "." GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

PAUSE

आउटपुट (कोई भी नहीं है,% 1 रिक्त नहीं था, खाली, या NULL):


उपरोक्त स्क्रिप्ट 1 के साथ किसी भी पैरामीटर के बिना ("Quotes.cmd निकालें") चलाएँ

आउटपुट (% 1 रिक्त, रिक्त या NULL) है:

Welcome!

Press any key to continue . . .

नोट: यदि आप एक चर को अंदर सेट करते हैं IF ( ) ELSE ( ) स्टेटमेंट के करते हैं, तो यह "IF" स्टेटमेंट से बाहर निकलने के बाद तब तक DEFINED के लिए उपलब्ध नहीं होगा (जब तक कि "डिलेड वेरिएबल एक्सपेंशन" सक्षम न हो; एक बार एक्सीलैंशन मार्क का उपयोग करने में सक्षम हो! "" के स्थान पर "!" प्रतिशत "%" प्रतीक}।

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

स्क्रिप्ट 2:

इनपुट ("Quotes.cmd निकालें" "यह एक परीक्षण है")

@ECHO OFF

SETLOCAL EnableDelayedExpansion

SET STRING=%0
IF 1==1 (
  SET STRING=%1
  ECHO String in IF Statement='%STRING%'
  ECHO String in IF Statement [delayed expansion]='!STRING!'
) 

ECHO String out of IF Statement='%STRING%'

REM Remove Quotes [Only Remove Quotes if NOT Null]
IF DEFINED STRING SET STRING=%STRING:"=%

ECHO String without Quotes=%STRING% 

REM IF %1 is NULL GOTO MyLabel
IF NOT DEFINED STRING GOTO MyLabel

REM GOTO End of File
GOTO :EOF

:MyLabel
ECHO Welcome!

ENDLOCAL
PAUSE

आउटपुट:

C:\Users\Test>"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd" "This is a Test"  
String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is a Test"'  
String out of IF Statement='"This is a Test"'  
String without Quotes=This is a Test  

C:\Users\Test>  

नोट: यह स्ट्रिंग के अंदर से उद्धरण भी निकाल देगा।

उदाहरण के लिए (स्क्रिप्ट 1 या 2 का उपयोग करके): C: \ Users \ Test \ Documents \ Batch फ़ाइलें> "Quotes.cmd निकालें" "यह" एक "टेस्ट" है

आउटपुट (स्क्रिप्ट 2):

String in IF Statement='"C:\Users\Test\Documents\Batch Files\Remove Quotes.cmd"'  
String in IF Statement [delayed expansion]='"This is "a" Test"'  
String out of IF Statement='"This is "a" Test"'  
String without Quotes=This is a Test  

स्क्रिप्ट 2 में किसी भी पैरामीटर के बिना निष्पादित करें ("Quotes.cmd निकालें"):

आउटपुट:

Welcome!

Press any key to continue . . .

3

चीजों को योग करने के लिए:

set str=%~1
if not defined str ( echo Empty string )

यह कोड "खाली स्ट्रिंग" को आउटपुट करेगा यदि% 1 या तो "" या "खाली" है या इसे स्वीकार किए गए उत्तर में जोड़ा गया है जो वर्तमान में गलत है।


0

मेरे पास नेट पर बहुत सारे जवाबों के साथ बहुत सारे मुद्दे हैं। अधिकांश चीजों के लिए सबसे अधिक काम होता है, लेकिन हमेशा एक कोने का मामला होता है जो प्रत्येक को तोड़ता है।
शायद यह काम नहीं करता है अगर यह उद्धरण मिला है, तो शायद यह टूट जाता है अगर इसमें उद्धरण नहीं है, वाक्यविन्यास त्रुटि अगर var में एक स्थान है, तो कुछ केवल मापदंडों पर काम करेंगे (जैसा कि पर्यावरण चर के विपरीत), अन्य तकनीक एक खाली अनुमति देते हैं 'परिभाषित' के रूप में पारित करने के लिए उद्धरण का सेट, और कुछ पेचीदा वाले आपको elseबाद में श्रृंखला नहीं बनने देंगे ।

यहां एक ऐसा समाधान है जिससे मैं खुश हूं, कृपया मुझे बताएं कि यदि आपको कोई कोने का मामला मिल जाए तो यह आपके लिए कारगर नहीं होगा।

:ifSet
if "%~1"=="" (Exit /B 1) else (Exit /B 0)

उस सबरूटीन के पास या तो आपकी लिपि में है, या वह स्वयं में है .bat, काम करना चाहिए।
इसलिए यदि आप लिखना चाहते हैं (छद्म में):

if (var)
then something
else somethingElse

तुम लिख सकते हो:

(Call :ifSet %var% && (
    Echo something
)) || (
    Echo something else
)

इसने मेरे सभी परीक्षणों के लिए काम किया:

(Call :ifSet && ECHO y) || ECHO n
(Call :ifSet a && ECHO y) || ECHO n
(Call :ifSet "" && ECHO y) || ECHO n
(Call :ifSet "a" && ECHO y) || ECHO n
(Call :ifSet "a a" && ECHO y) || ECHO n

Echo'd n, y, n, y,y


और ज्यादा उदाहरण:

  • सिर्फ जांच करना चाहते हैं if?Call :ifSet %var% && Echo set
  • बस अगर नहीं (केवल अन्य)? Call :ifSet %var% || Echo set
  • एक पारित तर्क की जाँच; ठीक काम करता है।Call :ifSet %1 && Echo set
  • क्या आप अपनी स्क्रिप्ट्स / डूप कोड को रोकना नहीं चाहते हैं, इसलिए आपने इसे खुद में डाल लिया है ifSet.bat? कोई दिक्कत नहीं है:((Call ifSet.bat %var%) && Echo set) || (Echo not set)

एक मामला मिला; आप और वाक्य रचना के साथ करता है, तो कोशिश करें, और फिर ब्लॉक में पिछले आदेश विफल रहता है, किसी और पर अमल होगा: (Call ifSet.bat YES && (Echo true & Echo x | findstr y)) || Echo, इको true और false
Hashbrown

वास्तव में, अगर यह एक मुद्दा है, और आप एक अतिरिक्त लाइन से निपट सकते हैं, तो आप इसे ifSetस्वयं कॉल करके इसे कम कर सकते हैं, फिर उपयोग कर सकते हैंIf %errorlevel% EQU 0 (x) Else (y)
Hashbrown

किन मामलों में स्वीकृत उत्तर (वर्ग कोष्ठक का उपयोग करें) काम नहीं करता है? और क्या आप बता सकते हैं कि Exit / B क्या करता है
blak3r

किसी कारण से जब मैंने परीक्षण किया तो यह setचर का उपयोग करते समय टूट गया (जैसे [%bob%], केवल तर्कों के लिए काम करना जैसे [%2]) लेकिन अब यह काम करता है। मुझे लगता है कि मेरा एकमात्र पकड़ []अब साथ है, यह खाली उद्धरणों को पास करने देता है, जबकि यह अभ्यस्त (तो यह आपके उपयोग के मामले में है, वास्तव में)
हैशब्रोएन

/Bझंडा बाहर निकलने, केवल सबरूटीन या बाहर निकलने से पूरे बैच बंद हो जाता है call'घ बैच। जब तक आप पूछ नहीं रहे हैं कि पूरा कमांड क्या कर रहा है; यह कॉलिंग स्क्रिप्ट को सबरूटीन ( 0पास, 1विफल), उत्तर में बूलियन तर्क के माध्यम से या %errorlevel%उपरोक्त टिप्पणियों के माध्यम से प्रयोग करने योग्य बताने के लिए एक त्रुटि कोड लौटा रहा है
Hashbrown

0

का उपयोग कर! इसके बजाय "खाली स्ट्रिंग जाँच के लिए

@echo off
SET a=
SET b=Hello
IF !%a%! == !! echo String a is empty
IF !%b%! == !! echo String b is empty

1
टिप वास्तव में खराब है। उद्धरण कम से कम रिक्त स्थान और विशेष वर्णों को संभाल सकते हैं, लेकिन विस्मयादिबोधक चिह्न नहीं कर सकते। और विस्मयबोधक चिह्न यहाँ वास्तव में बुरा मिलता है जब विलंबित विस्तार सक्षम किया जाता है
जेब

0

मुझे बस एक महीने से कम उम्र में मिला (भले ही यह 8 साल पहले पूछा गया था) ... मुझे आशा है कि वह अभी तक बैच फ़ाइलों से परे है। ;-) मैं हर समय ऐसा करता था। मुझे यकीन नहीं है कि अंतिम लक्ष्य क्या है, हालांकि। अगर s / वह मेरी तरह आलसी है, तो मेरा go.bat उस तरह के सामान के लिए काम करता है। (नीचे देखें) लेकिन, 1, ओपी में कमांड अवैध हो सकती है अगर आप सीधे इनपुट को कमांड के रूप में उपयोग कर रहे हैं। अर्थात,

"C:/Users/Me"

एक अमान्य कमांड है (या यदि आप एक अलग ड्राइव पर थे, तो इसका उपयोग किया जाता है)। आपको इसे दो भागों में तोड़ने की आवश्यकता है।

C:
cd /Users/Me

और, 2, 'परिभाषित' या 'अपरिभाषित' का क्या अर्थ है? GIGO। मैं त्रुटियों को पकड़ने के लिए डिफ़ॉल्ट का उपयोग करता हूं। यदि इनपुट पकड़ा नहीं जाता है, तो यह मदद करने के लिए गिरता है (या डिफ़ॉल्ट कमांड)। तो, कोई इनपुट त्रुटि नहीं है। आप इनपुट पर cd की कोशिश कर सकते हैं और यदि कोई एक है तो त्रुटि को पकड़ सकते हैं। (ठीक है, गो "डाउनलोड (केवल एक परन) का उपयोग करके डॉस द्वारा पकड़ा जाता है। (हर्ष!)

cd "%1"
if %errorlevel% neq 0 goto :error

और, 3, उद्धरण केवल पथ के चारों ओर की आवश्यकता है, कमांड नहीं। अर्थात,

"cd C:\Users" 

जब तक आप अलग ड्राइव पर नहीं थे तब तक खराब था (या पुराने दिनों में इस्तेमाल किया गया था)।

cd "\Users" 

कार्यात्मक है।

cd "\Users\Dr Whos infinite storage space"

अगर आपके रास्ते में जगह है तो काम करता है।

@REM go.bat
@REM The @ sigh prevents echo on the current command
@REM The echo on/off turns on/off the echo command. Turn on for debugging
@REM You can't see this.
@echo off
if "help" == "%1" goto :help

if "c" == "%1" C:
if "c" == "%1" goto :done

if "d" == "%1" D:
if "d" == "%1" goto :done

if "home"=="%1" %homedrive%
if "home"=="%1" cd %homepath%
if "home"=="%1" if %errorlevel% neq 0 goto :error
if "home"=="%1" goto :done

if "docs" == "%1" goto :docs

@REM goto :help
echo Default command
cd %1
if %errorlevel% neq 0 goto :error
goto :done

:help
echo "Type go and a code for a location/directory
echo For example
echo go D
echo will change disks (D:)
echo go home
echo will change directories to the users home directory (%homepath%)
echo go pictures
echo will change directories to %homepath%\pictures
echo Notes
echo @ sigh prevents echo on the current command
echo The echo on/off turns on/off the echo command. Turn on for debugging
echo Paths (only) with folder names with spaces need to be inclosed in         quotes (not the ommand)
goto :done

:docs
echo executing "%homedrive%%homepath%\Documents"
%homedrive%
cd "%homepath%\Documents"\test error\
if %errorlevel% neq 0 goto :error
goto :done

:error
echo Error: Input (%1 %2 %3 %4 %5 %6 %7 %8 %9) or command is invalid
echo go help for help
goto :done

:done

cd's /dस्विच: cd /d "C:\Users\Me" (and the proper path delimeter for Windows is `, नहीं /) का एक कारण है ।
स्टेपहान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.