উইন্ডোজ ব্যাচ-ফাইলে শর্তসাপূর্ণ বিবৃতি লেখার জন্য কি কোনও উপায় আছে?
উদাহরণ স্বরূপ:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
উইন্ডোজ ব্যাচ-ফাইলে শর্তসাপূর্ণ বিবৃতি লেখার জন্য কি কোনও উপায় আছে?
উদাহরণ স্বরূপ:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
উত্তর:
জেএমবিকিউ সমাধানটি ভাল তবে সব পরিস্থিতিতে যেমন ফোর ডু (...) লুপের মতো কোডের ব্লকের অভ্যন্তরে ব্যবহার করা যায় না।
একটি বিকল্প হ'ল একটি সূচক ভেরিয়েবল ব্যবহার করা। এটিকে অপরিজ্ঞাত করে তুলতে আরম্ভ করুন এবং তারপরেই কেবল সংজ্ঞায়িত করুন যদি কোনও ওআর শর্তটি সত্য হয়। তারপরে যদি চূড়ান্ত পরীক্ষা হিসাবে সংজ্ঞায়িত হয় তবে ব্যবহার করুন - বিলম্বিত সম্প্রসারণটি ব্যবহার করার দরকার নেই।
FOR ..... DO (
set "TRUE="
IF cond1 set TRUE=1
IF cond2 set TRUE=1
IF defined TRUE (
...
) else (
...
)
)
আপনি যদি ই এল এস ই যুক্তি যুক্ত করতে পারেন যা আরস্মুসেন এই কারণেই ব্যবহার করে যে এটি যদি প্রথম শর্তটি সত্য হয় তবে তাড়াতাড়ি দ্রুত সঞ্চালন করতে পারে, তবে আমি কখনই বিরক্ত করি না।
সংযোজন - এটি একটি অনুলিপি প্রশ্ন যা একটি আইআর-এর বিবৃতিতে উইনএক্সপি ব্যাচ স্ক্রিপ্টে একটি OR ব্যবহার করে প্রায় অনুরূপ উত্তর সহ
চূড়ান্ত সংযোজন - ভেরিয়েবল ক্ষেত্রে সংবেদনশীল মানগুলির তালিকার কোনও একটি হয় কিনা তা পরীক্ষা করতে আমি আমার প্রিয় কৌশলটি প্রায় ভুলে গেছি। গ্রহণযোগ্য মানগুলির একটি সীমিত তালিকা সহ একটি পরীক্ষা ভেরিয়েবল সূচনা করুন, এবং তারপরে অনুসন্ধানটি ব্যবহার করুন এবং পরীক্ষার জন্য প্রতিস্থাপন করুন যদি আপনার ভেরিয়েবল তালিকার মধ্যে থাকে test এটি খুব দ্রুত এবং একটি নির্বিচারে দীর্ঘ তালিকার জন্য নূন্যতম কোড ব্যবহার করে। এর জন্য বিলম্বিত সম্প্রসারণের প্রয়োজন নেই (অথবা অন্যথায় কল করুন% VAR %% ট্রিক)। এছাড়াও পরীক্ষাটি CASE INSENSITIVE।
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" (echo true) else (echo false)
VAR থাকে তবে উপরেরটি ব্যর্থ হতে পারে =
, তাই পরীক্ষাটি বোকা-প্রমাণ নয়।
যদি কোনও ব্লকের মধ্যে পরীক্ষা করা হয় যেখানে ভিআর এর বর্তমান মান অ্যাক্সেস করার জন্য বিলম্বিত সম্প্রসারণ প্রয়োজন
for ... do (
set "TEST=;val1;val2;val3;val4;val5;"
for /f %%A in (";!VAR!;") do if "!TEST:%%A=!" neq "!TEST!" (echo true) else (echo false)
)
ভিএআর-এর মধ্যে প্রত্যাশিত মানগুলির উপর নির্ভর করে "ডিলিমস =" এর মতো বিকল্পের প্রয়োজন হতে পারে
উপরোক্ত কৌশলটি =
আরও কিছু কোড যুক্ত করে ভিএআর দিয়েও নির্ভরযোগ্য করা যায় ।
set "TEST=;val1;val2;val3;val4;val5;"
if "!TEST:;%VAR%;=!" neq "!TEST!" if "!TEST:;%VAR%;=;%VAR%;"=="!TEST!" echo true
তবে এখন আমরা একটি ইএলএসই ধারা সরবরাহ করার ক্ষমতা হারিয়ে ফেলেছি যদি না আমরা একটি সূচক ভেরিয়েবল যোগ করি। কোডটি কিছুটা "কুরুচিপূর্ণ" দেখতে শুরু করেছে, তবে আমি মনে করি এটি পরীক্ষার জন্য সবচেয়ে ভাল পারফরম্যান্সযোগ্য পদ্ধতি যদি ভিএআর কেস-সংবেদনশীল বিকল্পগুলির মধ্যে স্বেচ্ছাসেবী সংখ্যার মধ্যে একটি হয়।
অবশেষে একটি সহজ সংস্করণ রয়েছে যা আমি মনে করি যে এটি কিছুটা ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে প্রতিটি মানের জন্য এটির একটি করে করা উচিত। আছিনী পূর্বে উল্লিখিত লিঙ্কে গৃহীত উত্তরের একটি মন্তব্যে এই সমাধান সরবরাহ করেছে
for %%A in ("val1" "val2" "val3" "val4" "val5") do if "%VAR%"==%%A echo true
মানগুলির তালিকায় * বা অন্তর্ভুক্ত থাকতে পারে না? অক্ষর এবং মানগুলির %VAR%
মধ্যে কোট থাকা উচিত নয়। দর সমস্যা হতে যদি %VAR%
আরো স্পেস বা মত বিশেষ অক্ষর রয়েছে ^
, &
এই সমাধান যদি না আপনি একটি সূচক পরিবর্তনশীল যোগ এটি একটি Else clause জন্য বিকল্প উপলব্ধ করা হয় না সঙ্গে প্রভৃতি অন্য একটি সীমাবদ্ধতা। উপকারিতা হ'ল এটি আইএফ /I
বিকল্পের উপস্থিতি বা অনুপস্থিতির উপর নির্ভর করে কেস সংবেদনশীল বা সংবেদনশীল হতে পারে ।
আমি তাই মনে করি না. কেবল দুটি আইএফ ব্যবহার করুন এবং একই লেবেলটি পান:
IF cond1 GOTO foundit
IF cond2 GOTO foundit
ECHO Didn't found it
GOTO end
:foundit
ECHO Found it!
:end
ECHO Didn't find it
।
এই পোস্টের জন্য ধন্যবাদ, এটি আমাকে অনেক সাহায্য করেছে।
ডান্নো যদি এটি সাহায্য করতে পারে তবে আমার কাছে সমস্যাটি ছিল এবং আপনাকে ধন্যবাদ আমি এই বুলিয়ান সমতুল্যের ভিত্তিতে এটি সমাধানের আরেকটি উপায় বলে আমি মনে করি তা কি:
"এ বা বি" "না (এ এবং বি নয়)" এর সমান
এইভাবে:
IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE
হয়ে:
IF not [%var%] == [1] IF not [%var%] == [2] ECHO FALSE
একটি "বা" শর্তটি ব্যবহার করতে একটি সাধারণ "ফর" একটি একক লাইনে ব্যবহার করা যেতে পারে:
FOR %%a in (item1 item2 ...) DO IF {condition_involving_%%a} {execute_command}
আপনার ক্ষেত্রে প্রয়োগ করা হয়েছে:
FOR %%a in (1 2) DO IF %var%==%%a ECHO TRUE
এমনকি যদি এই প্রশ্নটি আরও পুরানো হয়:
আপনি যদি ব্যবহার করতে চান if cond1 or cond 2
- আপনার এমন জটিল লুপগুলি বা স্টাফ ব্যবহার করা উচিত নয়।
ifs
একে অপরের সাথে একত্রিত হওয়ার পরে উভয়ই সহজ সরবরাহ করে goto
- এটি অন্তর্নিহিত বা।
//thats an implicit IF cond1 OR cond2 OR cond3
if cond1 GOTO doit
if cond2 GOTO doit
if cond3 GOTO doit
//thats our else.
GOTO end
:doit
echo "doing it"
:end
সবগুলি শর্ত মেলে যদি আপনি কোনও "ইনপ্লেস" ক্রিয়া না করে আপনি অ্যাকশনটি 3 বার কার্যকর করতে পারেন।
বাচে বা নেই IF <arg> OR
বা আছে , তবে ...ELIF
ELSE IF
আগের আইএফএসের ইএলএসই-র মধ্যে অন্য আইএফ-এর বাসা বাঁধার চেষ্টা করুন।
IF <arg> (
....
) ELSE (
IF <arg> (
......
) ELSE (
IF <arg> (
....
) ELSE (
)
)
কোনও ফাংশন ব্যবহার করা সম্ভব যা ওআর যুক্তির মূল্যায়ন করে এবং একক মান প্রদান করে।
@echo off
set var1=3
set var2=5
call :logic_or orResult "'%var1%'=='4'" "'%var2%'=='5'"
if %orResult%==1 (
echo At least one expression is true
) ELSE echo All expressions are false
exit /b
:logic_or <resultVar> expression1 [[expr2] ... expr-n]
SETLOCAL
set "logic_or.result=0"
set "logic_or.resultVar=%~1"
:logic_or_loop
if "%~2"=="" goto :logic_or_end
if %~2 set "logic_or.result=1"
SHIFT
goto :logic_or_loop
:logic_or_end
(
ENDLOCAL
set "%logic_or.resultVar%=%logic_or.result%"
exit /b
)
&& ... || ...
অতিরিক্ত IF ... ELSE ...
বিবরণের পরিবর্তে সরাসরি সুবিধাজনক বাক্য গঠন ব্যবহার করতে পারে ।
আইএফ গুলি পরোক্ষভাবে ব্যবহার করে লক্ষ্য অর্জন করা যায়।
নীচে একটি জটিল অভিব্যক্তির একটি উদাহরণ যা সিএমডি ব্যাচে অন্তর্নিহিত লেবেল এবং জিওটিও ছাড়াই বেশ সংক্ষিপ্তভাবে এবং যুক্তিযুক্তভাবে লেখা যেতে পারে।
() বন্ধনীগুলির মধ্যে কোড ব্লকগুলি সিএমডি একটি (প্যাটিচিক) ধরণের সাবসেল হিসাবে পরিচালনা করে। ব্লকের বাইরে যে কোনও প্রস্থান কোড আসবে না কেন এটি সত্য / মিথ্যা মান নির্ধারণ করতে ব্যবহৃত হবে যা ব্লকটি বৃহত্তর বুলিয়ান অভিব্যক্তিতে খেলবে। এই কোড ব্লকগুলি দিয়ে ইচ্ছামত বৃহত বুলিয়ান এক্সপ্রেশন তৈরি করা যেতে পারে।
সহজ উদাহরণ
প্রতিটি ব্লকের সত্য হিসাবে সংশোধন করা হয় (যেমন ব্লকের শেষ বিবৃতি কার্যকর হওয়ার পরে ERRORLEVEL = 0) / মিথ্যা, যতক্ষণ না পুরো এক্সপ্রেশনটির মান নির্ধারণ না করা হয় বা জাম্প আউট হয়ে যায় (যেমন GOTO এর মাধ্যমে):
((DIR c:\xsgdde /w) || (DIR c:\ /w)) && (ECHO -=BINGO=-)
জটিল উদাহরণ
এটি প্রাথমিকভাবে উত্থাপিত সমস্যা সমাধান করে। প্রতিটি ব্লকে একাধিক বিবৃতি সম্ভব তবে || || || প্রকাশটি এটি সংক্ষিপ্ত হওয়া ভাল যাতে এটি যতটা সম্ভব পঠনযোগ্য। CM সিএমডি ব্যাচগুলির একটি পালানোর চর এবং এটি যখন একটি লাইনের শেষে স্থাপন করা হয় তখন এটি ইওএল থেকে বাঁচতে পারে এবং সিএমডিকে পরবর্তী লাইনে স্টেটমেন্টের বর্তমান ব্যাচটি পড়া চালিয়ে যেতে নির্দেশ দেয়।
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
(
(CALL :ProcedureType1 a b) ^
|| (CALL :ProcedureType2 sgd) ^
|| (CALL :ProcedureType1 c c)
) ^
&& (
ECHO -=BINGO=-
GOTO :EOF
)
ECHO -=no bingo for you=-
GOTO :EOF
:ProcedureType1
IF "%~1" == "%~2" (EXIT /B 0) ELSE (EXIT /B 1)
GOTO :EOF (this line is decorative as it's never reached)
:ProcedureType2
ECHO :ax:xa:xx:aa:|FINDSTR /I /L /C:":%~1:">nul
GOTO :EOF
If %x%==1 (
If %y%==1 (
:: both are equal to 1.
)
)
এটি একাধিক ভেরিয়েবল সমান মান কিনা তা যাচাই করার জন্য। এখানে উভয় পরিবর্তনশীল জন্য।
If %x%==1 (
:: true
)
If %x%==0 (
If %y%==1 (
:: true
)
)
If %x%==0 (
If %y%==0 (
:: False
)
)
আমি মাথা থেকে যদি শীর্ষ থেকে যে চিন্তা। আমি এটি আরও কমপ্যাক্ট করতে পারে।
আমি বুঝতে পারি যে এই প্রশ্নটি পুরানো, তবে অন্য কেউ (আমার মতো) একই প্রশ্ন থাকার সময় এই থ্রেডটি খুঁজে পাওয়ার ক্ষেত্রে আমি একটি বিকল্প সমাধান পোস্ট করতে চেয়েছিলাম। আমি ভেরিয়েবল প্রতিধ্বনিত করে এবং বৈধতা প্রমাণের জন্য Findstr ব্যবহার করে কোনও ওআর অপারেটরের অভাব ঘটাতে সক্ষম হয়েছি।
for /f %%v in ('echo %var% ^| findstr /x /c:"1" /c:"2"') do (
if %errorlevel% equ 0 echo true
)
যদিও ডবেনহ্যামের উত্তরটি বেশ ভাল, IF DEFINED
আপনি যে ভেরিয়েবলটি পরীক্ষা করছেন তা যদি পরিবেশের না হয় তবে নির্ভর করে আপনাকে অনেক সমস্যায় ফেলতে পারে । স্ক্রিপ্ট ভেরিয়েবলগুলি এই বিশেষ চিকিত্সা পায় না।
যদিও এটি কিছু হাস্যকর undocumented BS এর মতো মনে হতে পারে, একটি সাধারণ শেল ক্যোয়ারী করে IF
যা IF /?
প্রকাশ করে যে,
সংজ্ঞায়িত শর্তসাপেক্ষে পরিবেশের পরিবর্তনশীল নাম গ্রহণ করা এবং পরিবেশের ভেরিয়েবলটি সংজ্ঞায়িত করা হলে সত্যটি প্রত্যাশা ব্যতীত কেবল অস্তিত্বের মতোই কাজ করে ।
এই প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে, একাধিক মূল্যায়নের পরে কেবল একটি সাধারণ পতাকা ব্যবহার না করার কোনও কারণ আছে কি? OR
অন্তর্নিহিত যুক্তি এবং পাঠযোগ্যতার ক্ষেত্রে উভয়ই আমার কাছে এটি সবচেয়ে নমনীয় চেক বলে মনে হয় । উদাহরণ স্বরূপ:
Set Evaluated_True=false
IF %condition_1%==true (Set Evaluated_True=true)
IF %some_string%=="desired result" (Set Evaluated_True=true)
IF %set_numerical_variable% EQ %desired_numerical_value% (Set Evaluated_True=true)
IF %Evaluated_True%==true (echo This is where you do your passing logic) ELSE (echo This is where you do your failing logic)
স্পষ্টতই, এগুলি যে কোনও শর্তাধীন মূল্যায়ন হতে পারে তবে আমি কয়েকটি উদাহরণ ভাগ করছি।
আপনি যদি লিখিত বুদ্ধিমান হয়ে সমস্ত কিছু এক লাইনে রাখতে চান তবে আপনি কেবল তাদের সাথে এই &&
জাতীয় শৃঙ্খলা তৈরি করতে পারবেন :
Set Evaluated_True=false
IF %condition_1%==true (Set Evaluated_True=true) && IF %some_string%=="desired result" (Set Evaluated_True=true) && IF %set_numerical_variable% EQ %desired_numerical_value% (Set Evaluated_True=true)
IF %Evaluated_True%==true (echo This is where you do your passing logic) ELSE (echo This is where you do your failing logic)
কখনও কাজের অস্তিত্ব পায়নি।
G: xyz / what geto h: অন্যটি xcopy গ: কারেন্ট / ফাইলস g: বু / বর্তমান সেখানে সংশোধনকারী / একটি ইত্যাদি রয়েছে তা নিশ্চিত নয়। দোকানে ল্যাপটপ। এবং অফিসে কম্পিউটার। আমি সেখানে নেই
উইন্ডোজ এক্সপি-র উপরে কাজ করার জন্য ব্যাচের ফাইলগুলি কখনও পাই নি
আমি সাধারণত যে আরও দ্রুত বিকল্প ব্যবহার করি তা হ'ল নিম্নরূপ, কারণ আমি "বা" একটি নির্বিচার সংখ্যক শর্তাদি যা চলক জায়গাতে ফিট করতে পারি
@(
Echo off
Set "_Match= 1 2 3 "
)
Set /a "var=3"
Echo:%_Match%|Find " %var% ">nul || (
REM Code for a false condition goes here
) && (
REM code for a true condition goes here.
)
এটি কিছুটা পুরানো প্রশ্ন অনুধাবন করে, প্রতিক্রিয়াগুলি আমাকে একটি ব্যাচের ফাইলে কমান্ড লাইন আর্গুমেন্টগুলি পরীক্ষা করার সমাধান নিয়ে আসে; সুতরাং অন্য কেউ যদি অনুরূপ সমাধানের সন্ধান করে তবে আমি আমার সমাধানটি পোস্ট করতে চেয়েছিলাম।
প্রথমটি যেটি আমার উল্লেখ করা উচিত তা হ'ল IF পেতে সমস্যা হচ্ছিল ... একটি ফর এর ভিতরে কাজ করার জন্য ELSE বিবৃতি ... ডিও ক্লজ। দেখা যাচ্ছে (অবিচ্ছিন্নভাবে তার উদাহরণগুলিতে এটিকে নির্দেশ করার জন্য ডেনহ্যামকে ধন্যবাদ) ইএলএসই বিবৃতিটি বন্ধ প্যারেন্সগুলির থেকে পৃথক লাইনে থাকতে পারে না।
সুতরাং এর পরিবর্তে:
FOR ... DO (
IF ... (
)
ELSE (
)
)
যা পাঠযোগ্যতা এবং নান্দনিক কারণে আমার পছন্দ, আপনার এটি করতে হবে:
FOR ... DO (
IF ... (
) ELSE (
)
)
এখন ইএলএসই বিবৃতিটি একটি অচিহ্নিত কমান্ড হিসাবে ফিরে আসে না।
পরিশেষে, আমি যা করার চেষ্টা করেছিলাম তা এখানে - আমি কোনও ব্যাচ ফাইলটিতে কয়েকটি যুক্তি পাস করতে সক্ষম হতে চেয়েছিলাম, কেসকে উপেক্ষা করে এবং পাসপোর্ট করা / অপরিজ্ঞাত যুক্তিতে ব্যর্থ হওয়া। সুতরাং আমার সমাধানটি এখানে ...
@ECHO OFF
SET ARG1=FALSE
SET ARG2=FALSE
SET ARG3=FALSE
SET ARG4=FALSE
SET ARGS=(arg1 Arg1 ARG1 arg2 Arg2 ARG2 arg3 Arg3 ARG3)
SET ARG=
FOR %%A IN (%*) DO (
SET TRUE=
FOR %%B in %ARGS% DO (
IF [%%A] == [%%B] SET TRUE=1
)
IF DEFINED TRUE (
SET %%A=TRUE
) ELSE (
SET ARG=%%A
GOTO UNDEFINED
)
)
ECHO %ARG1%
ECHO %ARG2%
ECHO %ARG3%
ECHO %ARG4%
GOTO END
:UNDEFINED
ECHO "%ARG%" is not an acceptable argument.
GOTO END
:END
দ্রষ্টব্য, এটি কেবল প্রথম ব্যর্থ যুক্তিটির প্রতিবেদন করবে। সুতরাং যদি ব্যবহারকারী একাধিক অগ্রহণযোগ্য যুক্তিতে পাস করে তবে এটিকে সংশোধন না করা পর্যন্ত কেবল প্রথম সম্পর্কে বলা হবে, তারপরে দ্বিতীয়, ইত্যাদি etc.
IF [%var%]==[1] IF [%var2%]==[2] ECHO BOTH ARE TRUE
। আমি নির্ধারণ করতে ব্যবহৃতSET AND=IF
এবং তারপর লিখুন:IF cond1 %AND% cond2 ECHO BOTH ARE TRUE
।