কোনও ব্যাচের ফাইলে কোনও প্যারামিটার খালি থাকলে পরীক্ষার উপযুক্ত উপায় কী?


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.নীচের সমাধান যা সমস্যার সমাধানের জন্য বর্গাকার বন্ধনী ব্যবহার করে সঠিক উত্তর হিসাবে চিহ্নিত করা হয়েছে তবে এটি আরও ভাল কিছু করছে বলে মনে হয় না seem । যখন %1বিজোড় সংখ্যক ডাবল-কোট থাকে তখন সেই দ্রবণটিও একই ত্রুটির সাথে ব্যর্থ হয় ।
সুসম পাল

সুসাম্পাল এর অধীনে প্রথম বন্ধনী সংস্করণ ব্যবহার করে দেখুন এবং এটি কাজ করে কিনা। এই আমি আরও পরীক্ষা। আমি মাত্র কয়েক দিন আগে গৃহীত উত্তরটি আপডেট করেছি।
blak3r

ড্যান স্টোরির উত্তরটি সত্যিই দুর্দান্তভাবে কাজ করবে বলে মনে হচ্ছে। আমি স্কোয়ার বন্ধনী ব্যবহার করে সংস্করণটি ব্যবহার করেছি।
সুসাম পাল

একটি ভাল "সমস্ত ধরুন" উদাহরণ: ফাইল / ডিরেক্টরি এবং আর্গুমেন্টে জেনেরিক স্ট্রিং / নম্বর মিক্স উভয়কেই covering েকে রাখে স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ৮৮০৫65৫ /।

তাই হতাশাজনক - IF DEFINEDশুধুমাত্র স্ক্রিপ্ট ভেরিয়েবলের পরিবর্তে পরিবেশের ভেরিয়েবলগুলিতে কাজ করা এমন সম্ভাবনার অপচয়!
kayleeFrye_onDeck

উত্তর:


290

উদ্ধৃতি চিহ্নগুলির পরিবর্তে বর্গাকার বন্ধনী ব্যবহার করুন:

IF [%1] == [] GOTO MyLabel

অভিভাবকরা নিরাপত্তাহীন : কেবল বর্গাকার বন্ধনী ব্যবহার করুন।


11
প্রথম বন্ধনী নিরাপদ নয়! পছন্দের সামগ্রীর &মধ্যে %1লাইন ভঙ্গ করবে
Jeb

14
যুক্তিটির কোনও ফাঁকা স্থান না থাকায় অন্য চরিত্রের মতো if #%1#==##বা ব্যবহার করা if [%1]==[]এতক্ষণ ভাল, অন্যথায় আপনি …was unexpected at this timeত্রুটি পাবেন।
Synetech

12
এবং ব্যবহার "%~1"করা সত্যিই একটি ভাল পদ্ধতির, যেমন আমি আমার উত্তরে উল্লেখ করেছি।
জেমসডলিন

8
বন্ধুরা, @ জেমসডলিন সঠিক। ভেরিয়েবলের পাঠ্যের ফাঁকা জায়গা থাকে বা হয় তবে এই পদ্ধতির কাজ হবে না ==। পরিবর্তে তার উত্তর ব্যবহার করুন।
জেমস কো

4
আপনি এটি পরিষ্কার করে দিবেন না it DOES NOT work with spaces। পরিবর্তে @ জেমসডলিন উত্তর ব্যবহার করুন।
জেবি। মনিকার সাথে।

153

তুমি ব্যবহার করতে পার:

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

বাইরের উক্তি সেট সেট করতে। সাধারণত, বর্গাকার বন্ধনী ব্যবহারের চেয়ে এটি একটি নির্ভরযোগ্য পদ্ধতি কারণ এটি ভেরিয়েবলের ফাঁকা স্থান থাকলেও এটি কাজ করবে।


9
এটি আসলে এটি করার একটি ভাল উপায়। ব্যবহার করে ~, আপনি বাহিরের উদ্ধৃতিগুলি উপস্থিত থাকলে তা ছড়িয়ে দিন, তবে তারপরে ম্যানুয়ালি এগুলি যুক্ত করুন (কেবলমাত্র একটি সেট নিশ্চিত করে)। তাছাড়া, আপনি আছে কোট ব্যবহার করে যুক্তি স্পেস রয়েছে (আমি এই কঠিন পথ ব্যবহার করে যখন আমার পূর্ববর্তী সংস্করণ শিখেছি #বা কোট পরিবর্তে বন্ধনী স্পেস দিয়ে সৃষ্ট আর্গুমেন্ট একটি নিক্ষেপ করতে …was unexpected at this timeত্রুটি।)
Synetech

4
এটি কি% 1 এর মতো যুক্তির চেয়ে% MYVAR% এর মতো সাধারণ ভেরিয়েবলের জন্য প্রযোজ্য?
সরল ব্যবহারকারী 17:58 এ 17:52

4
@ সিম্প্লিউজার ওফস, আপনি ঠিক বলেছেন, এটি সাধারণ পরিবেশের ভেরিয়েবলগুলির সাথে কাজ করে না।
জেমসডলিন

1
স্ট্রিংগুলির জন্য নজর রাখুন যা পালানোর ক্রম হিসাবে ডাবল '' 'ব্যবহার করে - তুলনা করার চেষ্টা করার সময় স্ক্রিপ্টটি ক্র্যাশ হয়ে যায় ""this string will crash the comparison""Double স্ট্রিং খালি।
Tydaeus

1
@Amalgovinus আপনি সম্ভবত একটি সাবরুটিন একটি আর্গুমেন্ট হিসাবে পরিবর্তনশীল প্রেরণ এবং সাবরুটিন ব্যবহার করতে দিন পারে "%~1"
জেমসডলিন

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 [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

......

সংজ্ঞাযুক্ত শর্তসাপেক্ষে পরিবেশের পরিবর্তনশীল নাম গ্রহণ ব্যতীত উপস্থিতিগুলির মতোই কাজ করে এবং পরিবেশের পরিবর্তনশীল সংজ্ঞায়িত হলে সত্যটি প্রত্যাবর্তন হয়।


1
হ্যাঁ, আমি আসলে এই পদ্ধতির চেষ্টা করেছি এবং যা আমি এটি বলতে পারি তা কেবল পরিবেশের ভেরিয়েবলগুলির সাথে কাজ করে। অতএব, ব্যাচ ফাইলের মধ্যে% 1 বা কোনও ভেরিয়েবলের সংজ্ঞা দেওয়া হয়নি work
blak3r

2
এটি কেবল সত্য %1এবং পছন্দগুলির জন্য। "ব্যাচ ফাইল ভিতরে সংজ্ঞায়িত ভেরিয়েবল" আসলে হয় এনভায়রনমেন্ট ভেরিয়েবল যখন ব্যাচ ফাইল চলমান হয়, এবং আপনি ব্যবহার করতে পারেন IF DEFINEDতাদের উপর।
zb226

8

দুর্ভাগ্যক্রমে আমার নিজের লেখার জন্য বর্তমান উত্তরগুলিতে মন্তব্য করার বা ভোট দেওয়ার মতো যথেষ্ট খ্যাতি নেই।

মূলত ওপি-র প্রশ্নটি "প্যারামিটার" না দিয়ে "পরিবর্তনশীল" বলেছিল যা খুব বিভ্রান্তিকর হয়ে পড়েছিল, বিশেষত খালি ভেরিয়েবলগুলির পরীক্ষা করার জন্য গুগলের এটি প্রথম নম্বর লিঙ্ক হিসাবে। আমার আসল উত্তরটি থেকে, স্টিফান সঠিক শব্দটি ব্যবহারের জন্য মূল প্রশ্নটি সম্পাদনা করেছেন, তবে আমার উত্তরটি মুছে ফেলার পরিবর্তে আমি কোনও বিভ্রান্তি দূর করতে সাহায্য করার জন্য এটি ছেড়ে দেওয়ার সিদ্ধান্ত নিয়েছি, বিশেষত গুগল এখনও এখানে ভেরিয়েবলের জন্য লোক পাঠাচ্ছে:

% 1 কোনও পরিবর্তনযোগ্য নয়! এটি একটি কম্যান্ড লাইন প্যারামিটার।

খুব গুরুত্বপূর্ণ পার্থক্য। কোনও সংখ্যার সাথে একটি একক শতাংশের চিহ্ন এটি কমান্ড লাইন প্যারামিটারকে ভেরিয়েবল নয় বলে উল্লেখ করে।

ভেরিয়েবলগুলি সেট কমান্ড ব্যবহার করে সেট করা হয় এবং 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.

(আপনি যদি কমান্ড লাইন প্যারামিটারগুলি পরীক্ষা করতে চান তবে আমি জেমসডলিনের উত্তর উল্লেখ করার পরামর্শ দিই))


1
তুমি ঠিক. তবে সঠিক উপায়টি হ'ল শিরোনামটি কেবল থেকে সংশোধন if variable is emptyকরা if parameter is empty। আমি এটা করেছি। (কিছু উত্তর অকার্যকর করার ঝুঁকিতে, যা প্যারামিটারগুলির পরিবর্তে ভেরিয়েবলগুলি পরীক্ষা করে এবং তাই যে কোনওভাবেই তারা অবৈধ, কারণ তারা প্রশ্নের উত্তর দেয়নি)
স্টিফান

1
ঠিক আছে ধন্যবাদ স্টিফান, বুঝতে পারিনি যে আপনি এটি করতে পারেন। আপডেটটি প্রতিফলিত করতে আমি আমার উত্তর সম্পাদনা করেছি।
অটোম্যাটটিক

6

ব্যাচ ফাইলে ভেরিয়েবল পরীক্ষা করতে "IF সংজ্ঞাযুক্ত ভেরিয়েবল কমান্ড" ব্যবহার করুন।

তবে আপনি যদি ব্যাচের প্যারামিটারগুলি পরীক্ষা করতে চান, তবে জটিল ইনপুট এড়ানোর জন্য কোডগুলির নীচে চেষ্টা করুন (যেমন "1 2" বা আব ^> সিডি)

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
)

আপনার সমাধানটি ব্যর্থ হয় যখন ভেরিয়েবলের একটি উদ্ধৃতি থাকে। বিটিডব্লিউটিতে IF DEFINED varএকটি কারণে সিনট্যাক্স বিদ্যমান রয়েছে
jeb

4

আমি সাধারণত এটি ব্যবহার করি:

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

যদি% 1 খালি থাকে তবে IF তুলনা করবে ""। প্রতি "." যা সত্যের মূল্যায়ন করবে।


4
এটি ভুল। এটি একই জিনিস: যদি "% 1" == ""% 1 নিজেই এই ব্যর্থ হয় তবে এই পোস্টের কারণ ছিল।
blak3r

আপনি কি% 1 টি খালি আছে বা এর কোট রয়েছে কিনা তা পরীক্ষা করার চেষ্টা করছেন? প্রশ্নটি অস্পষ্ট। % 1 এর জন্য কমান্ড লাইনে কোনও কিছুই নির্দিষ্ট না করা থাকলে আমার উত্তর কাজ করে।
এফোরিয়া

> আপনি কি% 1 টি খালি আছে বা এর কোট রয়েছে কিনা তা পরীক্ষা করার চেষ্টা করছেন? @ ইফোরিয়া, এটি উভয়ই পরিচালনা করতে সক্ষম হতে হবে।
সেনেটেক

আমি% 1% সেট করা থাকলে আমার পক্ষে সুন্দরভাবে কাজ করার জন্য এটি ব্যবহার করে work ধন্যবাদ, ভাল উত্তর!
চার্লি এ

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 দৈর্ঘ্যের সাথে খালি রয়েছে
জেব

এই প্রসঙ্গে (cmd আর্গুমেন্টগুলি জিতে নিন), আপনি অন্য কোনও উপায়ে খালি স্ট্রিংকে বোঝাতে পারবেন না, এমনকি ডাবল একক-উদ্ধৃতিও নয় যা ইউনিক্স শেলের নীচে সমান খালি রয়েছে।
ব্যবহারকারী 6801759

হ্যাঁ, ""খালি স্ট্রিংয়ের জন্যও ব্যবহৃত %~1হয় তবে বাইরের উক্তিগুলি মুছে ফেলার জন্য এটি ব্যবহার করা বেশ সহজ । এমন জটিল সমাধান ব্যবহার করার দরকার নেই
jeb

আপনি ঠিক বলেছেন, আমি ভুলভাবে বলেছি, এটি কেবল খালি স্ট্রিংয়ের জন্য নয়, তবে যুক্তি গণনা করার একটি নিরাপদ উপায়। অন্যান্য উপায় যেমন "%~1"==""যুক্তি দিয়ে ব্যর্থ হবে "Long File Name".txtযা একটি বৈধ যুক্তি। সম্পাদনা : এবং আপনি অবশ্যই বলেছিলেন এটি অবশ্যই জটিল নয়। পরীক্ষার জন্য উপরে মাত্র 2 টি পদক্ষেপ, বাকী বাক্যটি উদাহরণস্বরূপ।
ব্যবহারকারী 6801759

"যদি সংজ্ঞায়িত এআরজি" পুরোপুরি কাজ করে না বলে মনে হয় (আমার পরিবর্তনশীল কমান্ড লাইন থেকে আসে না)
গ্রেফেরিক্স

4

তুমি ব্যবহার করতে পার

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

1
তাই আপনাকে স্বাগতম! আপনার উত্তর প্রশ্নের ভাল উত্তর বলে মনে হচ্ছে। আপনার যথেষ্ট পরিমাণে [খ্যাতি] থাকলে ( স্ট্যাকওভারফ্লো.com / হেল্প / ওয়াটস-রিপোর্ট ) আপনি যে কোনও পোস্টে মন্তব্য করতে সক্ষম হবেন । পরিবর্তে আমি কি করতে পারি তা এটি পরীক্ষা করে দেখুন
ওয়েওওয়েওয়ের

3

স্ক্রিপ্ট 1:

ইনপুট ("কোটস সিএমডি সরান" "এটি একটি পরীক্ষা")

@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 ফাঁকা, খালি বা NUL ছিল না):


উপরের স্ক্রিপ্ট 1 এর সাথে কোনও পরামিতি ছাড়াই ("Quotes.cmd সরান") চালান

আউটপুট (% 1 ফাঁকা, খালি, বা NULL):

Welcome!

Press any key to continue . . .

দ্রষ্টব্য: আপনি যদি কোনও IF ( ) ELSE ( )স্টেটমেন্টের অভ্যন্তরে কোনও ভেরিয়েবল সেট করেন তবে "আইএফ" স্টেটমেন্টটি প্রস্থান না করা পর্যন্ত এটি ডিফাইনডের জন্য উপলব্ধ হবে না (যদি না "বিলম্বিত পরিবর্তনশীল প্রসারণ" সক্ষম না করা হয়; একবার সক্ষম হয়ে গেলে এর পরিবর্তে বিস্মৃত চিহ্নটি ব্যবহার করুন "!) শতাংশ "%" প্রতীক}।

উদাহরণ স্বরূপ:

স্ক্রিপ্ট 2:

ইনপুট ("কোটস সিএমডি সরান" "এটি একটি পরীক্ষা")

@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 ব্যবহার করে): সি: \ ব্যবহারকারীদের \ পরীক্ষা \ নথিগুলি \ ব্যাচ ফাইলগুলি> "কোটস সিএমডি সরান" "এটি" একটি "পরীক্ষা"

আউটপুট (স্ক্রিপ্ট 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 টি" হয় "" বা "ফাঁকা থাকলে" খালি স্ট্রিং "আউটপুট দেবে currently এটি বর্তমানে ভুল হিসাবে স্বীকৃত উত্তরে যুক্ত করা হয়েছে।


0

নেটে প্রচুর উত্তর নিয়ে আমার প্রচুর সমস্যা হয়েছে। সর্বাধিক বেশিরভাগ জিনিসের জন্য কাজ করে তবে সর্বদা একটি কোণার কেস থাকে যা প্রতিটিকেই ভেঙে দেয়।
সম্ভবত এটির উদ্ধৃতি পেলে এটি কাজ করে না, সম্ভবত এর উদ্ধৃতি না থাকলে এটি ভেঙে যায়, ভেরের স্থান থাকলে সিনট্যাক্স ত্রুটি, কিছু কেবল পরামিতিগুলিতে কাজ করবে (পরিবেশের ভেরিয়েবলের বিপরীতে), অন্য কৌশলগুলি খালি অনুমতি দেয় 'সংজ্ঞায়িত' হিসাবে পাস করার জন্য উদ্ধৃতিগুলির সেট এবং কিছু কৌশলযুক্ত আপনাকে 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)) || Echotrue false
বাকীটি

প্রকৃতপক্ষে, যদি এটি কোনও সমস্যা হয় এবং আপনি একটি অতিরিক্ত লাইন মোকাবেলা করতে পারেন তবে আপনি ifSetনিজের কল করে If %errorlevel% EQU 0 (x) Else (y)
এইটিকে

কোন কোন ক্ষেত্রে গৃহীত উত্তর (বর্গাকার বন্ধনীর ব্যবহার) কাজ করে না? এবং আপনি প্রস্থান / বি কী করবে তা ব্যাখ্যা করতে পারেন
ব্লেক

কোনও কারণে যখন আমি পরীক্ষা করেছিলাম যখন setভেরিয়েবলগুলি ব্যবহার করার সময় এটি ভেঙে যায় (যেমন [%bob%]কেবলমাত্র যুক্তির জন্য কাজ করা হয় [%2]) তবে এখন এটি পুনরায় যাচাই করে কাজ করে। আমার মনে হয় []এখনকার আমার একমাত্র গ্রিপটি এটি খালি উদ্ধৃতিগুলি পাস করতে দেয়, যদিও এই
অভ্যাসটি

/Bপতাকা থেকে প্রস্থান, শুধুমাত্র সাবরুটিন বা থেকে প্রস্থান থেকে পুরো ব্যাচ স্টপ call'ঘ ব্যাচ। আপনি যদি না জিজ্ঞাসা করেন যে পুরো কমান্ডটি কি করছে; কলিং স্ক্রিপ্টটি সাববুটিনের ফলাফল ( 0পাস, 1ব্যর্থ), উত্তরের বুলিয়ান লজিকের মাধ্যমে বা %errorlevel%উপরের মন্তব্যগুলির মাধ্যমে ব্যবহারযোগ্য - এটি জানতে একটি ত্রুটি কোডটি ফিরিয়ে
দিচ্ছে

0

ব্যবহার ! "খালি স্ট্রিং চেকিংয়ের জন্য" পরিবর্তে

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

1
টিপটি সত্যিই খারাপ। উদ্ধৃতিগুলি ফাঁকা স্থান এবং বিশেষ অক্ষরগুলিকে কমপক্ষে পরিচালনা করতে পারে তবে বিস্মৃত চিহ্নগুলি তা করতে পারে না। এবং বিস্মৃত চিহ্নগুলি দেরী সম্প্রসারণ সক্ষম করা হলে এখানে সত্যিই খারাপ লাগবে
jeb

0

আমি ঠিক এক মাস বয়সী হয়েছি (যদিও এটি 8 বছর আগে জিজ্ঞাসা করা হয়েছিল) ... আমি আশা করি যে সে এখনই ব্যাচের ফাইলগুলির বাইরে চলে গেছে। ;-) আমি সব সময় এটি করতাম। যদিও আমি চূড়ান্ত লক্ষ্য কি তা নিশ্চিত নই। যদি সে আমার মতো অলস হয় তবে আমার গোব্যাট এ জাতীয় জিনিসগুলির জন্য কাজ করে। (নীচে দেখুন) তবে, 1, আপনি যদি কমান্ড হিসাবে সরাসরি ইনপুটটি ব্যবহার করেন তবে ওপিতে কমান্ডটি অবৈধ হতে পারে। অর্থাত,

"C:/Users/Me"

এটি একটি অবৈধ কমান্ড (বা আপনি যদি অন্য কোনও ড্রাইভে থাকতেন তবে ব্যবহৃত হত)। আপনার এটি দুটি ভাগে ভাঙতে হবে।

C:
cd /Users/Me

এবং, 2, 'সংজ্ঞায়িত' বা 'অপরিবর্তিত' অর্থ কী? GIGO। আমি ত্রুটিগুলি ধরার জন্য ডিফল্ট ব্যবহার করি। যদি ইনপুটটি ধরা না দেয়, এটি সাহায্যের জন্য ড্রপ হয় (বা কোনও ডিফল্ট কমান্ড)। সুতরাং, কোনও ইনপুট ত্রুটি নয়। আপনি ইনপুটটিতে সিডি করার চেষ্টা করতে পারেন এবং একটি থাকলে ত্রুটিটি ধরতে পারেন। (ঠিক আছে, গো "ডাউনলোডগুলি (কেবল একটি প্যারেন) ব্যবহার করে ডস ধরা পড়ে ((হর্ষ!))

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এর /dসুইচ হওয়ার কারণ আছে: is cd /d "C:\Users\Me" (and the proper path delimeter for Windows is , নয় /) not
স্টিফান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.