উইন্ডোজ ব্যাচ ফাইলে যদি ... বা আইএফ…


97

উইন্ডোজ ব্যাচ-ফাইলে শর্তসাপূর্ণ বিবৃতি লেখার জন্য কি কোনও উপায় আছে?

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

IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE

7
নং কি সম্ভব সরাসরি একটি ও লিখতে হল: IF [%var%]==[1] IF [%var2%]==[2] ECHO BOTH ARE TRUE। আমি নির্ধারণ করতে ব্যবহৃত SET AND=IFএবং তারপর লিখুন: IF cond1 %AND% cond2 ECHO BOTH ARE TRUE
আছিনী

উত্তর:


95

জেএমবিকিউ সমাধানটি ভাল তবে সব পরিস্থিতিতে যেমন ফোর ডু (...) লুপের মতো কোডের ব্লকের অভ্যন্তরে ব্যবহার করা যায় না।

একটি বিকল্প হ'ল একটি সূচক ভেরিয়েবল ব্যবহার করা। এটিকে অপরিজ্ঞাত করে তুলতে আরম্ভ করুন এবং তারপরেই কেবল সংজ্ঞায়িত করুন যদি কোনও ওআর শর্তটি সত্য হয়। তারপরে যদি চূড়ান্ত পরীক্ষা হিসাবে সংজ্ঞায়িত হয় তবে ব্যবহার করুন - বিলম্বিত সম্প্রসারণটি ব্যবহার করার দরকার নেই।

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বিকল্পের উপস্থিতি বা অনুপস্থিতির উপর নির্ভর করে কেস সংবেদনশীল বা সংবেদনশীল হতে পারে ।


দুর্ভাগ্যক্রমে ফাইল মান ম্যাঙ্ক শব্দার্থের কারণে %% A IN (-? -H -help) এর মতো প্রশ্ন চিহ্ন যুক্ত মানগুলির সাথে কাজ করবে না।
কিলরোয়

@ কিলরোয় - হ্যাঁ, আমি ইতিমধ্যে উত্তরে সেই সীমাবদ্ধতাটি লক্ষ্য করেছি। তবে আপনার মন্তব্য আমাকে উত্তরটি দেখতে বাধ্য করেছে এবং বুঝতে পারে যে সমাধানের জন্য আরও কিছু সীমাবদ্ধতা রয়েছে। আমি উত্তরটির শেষটি কিছুটা আপডেট করেছি।
dbenham

কোনও প্রতিস্থাপনের বিকল্পটি হবে না?
স্কোয়াশম্যান

@ স্কোয়াশম্যান - উঘ, হ্যাঁ, আপনি যদি সমস্ত FINDSTR বাগ এবং quirks নেভিগেট করতে চান।
dbenham

উত্তরটি ভুল। Aacini আরোপিত কমান্ড উদ্ধৃত যেমন ব্যর্থ, কিন্তু নিম্নরূপ সম্পাদিত কাজ যদি: %% একটি জন্য ( "val1" "val2" "val3") যদি "% VAR%" কি == %% একটি প্রতিধ্বনি সত্য
Ed999

54

আমি তাই মনে করি না. কেবল দুটি আইএফ ব্যবহার করুন এবং একই লেবেলটি পান:

IF cond1 GOTO foundit
IF cond2 GOTO foundit

ECHO Didn't found it
GOTO end

:foundit
ECHO Found it!

:end

হ্যাঁ যতদূর আমি বলতে পারি যে এই দুটিই একমাত্র বিকল্প।
মেছাফ্ল্যাশ

4
= ডি আমি আসলে পাওয়ারশেল শিখতে এবং আমার সমস্ত স্ক্রিপ্টগুলি মানিয়ে নেওয়ার প্রক্রিয়ায় আছি। তবে একটি ব্যাচের স্ক্রিপ্টে কেবল একটি ছোট বাগ ফিক্স করা দরকার এবং এটি সম্ভব কিনা তা জানতে চেয়েছিলেন। কোড লোল সাফ করার সময় আমি পিক আছি
মেছাফ্ল্যাশ

4
অনেক পরিস্থিতিতে কলটি গোটোর চেয়ে বেশি পছন্দনীয় হতে পারে, যদিও এটি কেবল তখনই কাজ করে যদি আপনার ELSE ধারাটির প্রয়োজন হয় না।
হ্যারি জনস্টন

@ হ্যারি জোনস্টন এটি নির্ভর করে যদি এটি কেবল একটি শীর্ষ-ডাউন প্রোগ্রাম / স্ক্রিপ্ট হয় বা এটির কাঠামোটি যদি ব্যাচ-স্ক্রিপ্টিং = / / তে উপস্থিত থাকে তবে এটি চালিত হয়। তার উদাহরণে, GOTO সঠিক হবে বা অন্যথায় এটি সন্ধান না করা পর্যন্ত আপনি আঘাত করবেন ECHO Didn't find it
মেছাফ্ল্যাশ

ব্যাটারকে অপারেটরকে সমর্থন করা কতটা কঠিন? এটি 2019 সালে কার্যকর করা হয়নি
জোক হুয়াং

8

এই পোস্টের জন্য ধন্যবাদ, এটি আমাকে অনেক সাহায্য করেছে।

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

"এ বা বি" "না (এ এবং বি নয়)" এর সমান

এইভাবে:

IF [%var%] == [1] OR IF [%var%] == [2] ECHO TRUE

হয়ে:

IF not [%var%] == [1] IF not [%var%] == [2] ECHO FALSE

তবে এটি কেবলমাত্র ফলস (ইএলএসই) শাখা সরবরাহ করে যদি না সত্য হয়। যদি সত্য হয় তবে ওপি সত্যিকারের শাখা চায়।
dbenham

8

একটি "বা" শর্তটি ব্যবহার করতে একটি সাধারণ "ফর" একটি একক লাইনে ব্যবহার করা যেতে পারে:

FOR %%a in (item1 item2 ...) DO IF {condition_involving_%%a} {execute_command}  

আপনার ক্ষেত্রে প্রয়োগ করা হয়েছে:

FOR %%a in (1 2) DO IF %var%==%%a ECHO TRUE

আমি এটিকে আমার ব্যাচের স্ক্রিপ্টগুলিতে সবচেয়ে সোজা ফরোয়ার্ড এবং সহজ ব্যবহার হিসাবে দেখতে পেয়েছি। প্রস্তাবিত উত্তর হিসাবে এটি কীভাবে এলো না?
myusrn

ধন্যবাদ আমি জানি না, সাধারণভাবে উত্সাহ দেওয়া একটি খুব অদ্ভুত প্রক্রিয়া (এবং সন্দেহজনক?), কেবল স্ট্যাকওভারফ্লোতে নয় অন্যান্য ফোরামেও। তবে এই ক্ষেত্রে, আমি অনুমান করি এটির সময়সাপেক্ষ। প্রশ্নটি বেশ পুরানো এবং আমার উত্তরটি সাম্প্রতিক re যাইহোক, যখন আমরা কার্যকর যে কোনও উত্তর পেতে পারি তখন আমাদের অবশ্যই খুশি হতে হবে । :)
অ্যাপোস্টোলোস

এক সম্ভাব্য এই কৌশল নিয়ে অপূর্ণতা (যদিও আমি আউট-অফ-boxness পদ্ধতির!) যে অবস্থার উপর নির্ভর করে , এটা হতে পারে কমান্ড দুইবার চালানো, চেয়েছিলেন না হতে পারে সম্ভব হবে।
ট্রিপহাউন্ড

তাত্ত্বিকভাবে, হ্যাঁ তবে আমি শত শত ব্যাচের ফাইল তৈরি করেছি, আমি প্রতিদিন তাদের কয়েক ডজন ব্যবহার করি এবং আমি এর আগে কখনও পাই নি। তাহলে আসুন অনুশীলনে থাকি! :)
Apostolos

6

এমনকি যদি এই প্রশ্নটি আরও পুরানো হয়:

আপনি যদি ব্যবহার করতে চান 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 বার কার্যকর করতে পারেন।


সন্ধান পাওয়া উত্তরটি ইতিমধ্যে সরবরাহ করা হয়েছে। মাস্ট যে তদারকি করেছেন।
16

2

বাচে বা নেই IF <arg> ORবা আছে , তবে ...ELIFELSE IF

আগের আইএফএসের ইএলএসই-র মধ্যে অন্য আইএফ-এর বাসা বাঁধার চেষ্টা করুন।

IF <arg> (
    ....
) ELSE (
    IF <arg> (
        ......
    ) ELSE (
        IF <arg> (
            ....
        ) ELSE (
    )
)

4
এটি ওআর এর ভাল প্রয়োগকরণ নয় কারণ কার্যকর করার জন্য শর্তসাপেক্ষ কোডটি অবশ্যই প্রতিটি ইএলএসই আইএফ-এর জন্য প্রতিলিপি করা উচিত। (যদি না শর্তাধীন কোডটি একটি গোটো হয় তবে সেক্ষেত্রে আপনার কাছে zmbq এর সমাধানের আরও ভারবস ফর্ম রয়েছে।)
dbenham

2

কোনও ফাংশন ব্যবহার করা সম্ভব যা ওআর যুক্তির মূল্যায়ন করে এবং একক মান প্রদান করে।

@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
) 

+1, এই কার্যটি ERRORLEVEL রিটার্ন কোডে ফলাফল ফিরিয়ে দেওয়ার জন্য ভাল প্রার্থী। তারপরে কলটি && ... || ...অতিরিক্ত IF ... ELSE ...বিবরণের পরিবর্তে সরাসরি সুবিধাজনক বাক্য গঠন ব্যবহার করতে পারে ।
dbenham

2

আইএফ গুলি পরোক্ষভাবে ব্যবহার করে লক্ষ্য অর্জন করা যায়।

নীচে একটি জটিল অভিব্যক্তির একটি উদাহরণ যা সিএমডি ব্যাচে অন্তর্নিহিত লেবেল এবং জিওটিও ছাড়াই বেশ সংক্ষিপ্তভাবে এবং যুক্তিযুক্তভাবে লেখা যেতে পারে।

() বন্ধনীগুলির মধ্যে কোড ব্লকগুলি সিএমডি একটি (প্যাটিচিক) ধরণের সাবসেল হিসাবে পরিচালনা করে। ব্লকের বাইরে যে কোনও প্রস্থান কোড আসবে না কেন এটি সত্য / মিথ্যা মান নির্ধারণ করতে ব্যবহৃত হবে যা ব্লকটি বৃহত্তর বুলিয়ান অভিব্যক্তিতে খেলবে। এই কোড ব্লকগুলি দিয়ে ইচ্ছামত বৃহত বুলিয়ান এক্সপ্রেশন তৈরি করা যেতে পারে।

সহজ উদাহরণ

প্রতিটি ব্লকের সত্য হিসাবে সংশোধন করা হয় (যেমন ব্লকের শেষ বিবৃতি কার্যকর হওয়ার পরে 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

1
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
)
)

আমি মাথা থেকে যদি শীর্ষ থেকে যে চিন্তা। আমি এটি আরও কমপ্যাক্ট করতে পারে।


1

আমি বুঝতে পারি যে এই প্রশ্নটি পুরানো, তবে অন্য কেউ (আমার মতো) একই প্রশ্ন থাকার সময় এই থ্রেডটি খুঁজে পাওয়ার ক্ষেত্রে আমি একটি বিকল্প সমাধান পোস্ট করতে চেয়েছিলাম। আমি ভেরিয়েবল প্রতিধ্বনিত করে এবং বৈধতা প্রমাণের জন্য Findstr ব্যবহার করে কোনও ওআর অপারেটরের অভাব ঘটাতে সক্ষম হয়েছি।

for /f %%v in ('echo %var% ^| findstr /x /c:"1" /c:"2"') do (
    if %errorlevel% equ 0 echo true
)

1

যদিও ডবেনহ্যামের উত্তরটি বেশ ভাল, 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)

0

কখনও কাজের অস্তিত্ব পায়নি।

G: xyz / what geto h: অন্যটি xcopy গ: কারেন্ট / ফাইলস g: বু / বর্তমান সেখানে সংশোধনকারী / একটি ইত্যাদি রয়েছে তা নিশ্চিত নয়। দোকানে ল্যাপটপ। এবং অফিসে কম্পিউটার। আমি সেখানে নেই

উইন্ডোজ এক্সপি-র উপরে কাজ করার জন্য ব্যাচের ফাইলগুলি কখনও পাই নি


যেমন আপনার উদাহরণে লেখা আছে, "যদি না থাকে তবে g: xyz / what", xyz / কি g: ড্রাইভের বর্তমান ডিরেক্টরিটির সাথে সম্পর্কিত, যা g এর মূল ফোল্ডার নাও হতে পারে। আপনার এখানে "g: \ xyz \ কি" দরকার? সি: কারেন্ট / ফাইল এবং জি: বু / কারেন্টের সাথে একই। মনে রাখবেন যে প্রতিটি ড্রাইভের আলাদা আলাদা ফোল্ডার রয়েছে এবং এটি ড্রাইভটি যদি আপনার বর্তমান কার্যনির্বাহী ডিরেক্টরি নাও হয় তবে এটি "মনে রাখা হয়"।
জন এলিয়ন 22'18

0

আমি সাধারণত যে আরও দ্রুত বিকল্প ব্যবহার করি তা হ'ল নিম্নরূপ, কারণ আমি "বা" একটি নির্বিচার সংখ্যক শর্তাদি যা চলক জায়গাতে ফিট করতে পারি

@(
  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.
)

-3

এটি কিছুটা পুরানো প্রশ্ন অনুধাবন করে, প্রতিক্রিয়াগুলি আমাকে একটি ব্যাচের ফাইলে কমান্ড লাইন আর্গুমেন্টগুলি পরীক্ষা করার সমাধান নিয়ে আসে; সুতরাং অন্য কেউ যদি অনুরূপ সমাধানের সন্ধান করে তবে আমি আমার সমাধানটি পোস্ট করতে চেয়েছিলাম।

প্রথমটি যেটি আমার উল্লেখ করা উচিত তা হ'ল 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.


-1 'ফরফ লুপে সিনফ্যাক্স' বা এই আর্গুমেন্টগুলি কীভাবে সঠিকভাবে পাস করবেন এই প্রশ্নের কোনও সম্পর্ক ছিল না, তবে কোনও ব্যাচের ফাইলে যদি বিবৃতি দেওয়ার একটি উপায় আবিষ্কার করে তবে তা করা উচিত।
মেছাফ্ল্যাশ

4
যথেষ্ট ফর্সা। অনুমান যে আমি আমার নিজের প্রশ্নের উত্তর দিচ্ছিলাম যে এই উত্তরগুলি আমাকে ওপি-র মূল প্রশ্নের উত্তর দেওয়ার ক্ষেত্রে যত্নবান হওয়ার চেয়ে আরও বেশি সাহায্য করেছিল। ভবিষ্যতে আরও যত্নবান হতে হবে। ধন্যবাদ মেছাফ্ল্যাশ! -আর
আরএমডাব্লুচাউস

4
আপনার যদি প্রকৃতির অনুরূপ কোনও প্রশ্ন থাকে, তবে নিজেই সেই প্রশ্নটি সমাধান করেছেন এবং স্ট্যাকওভারফ্লোতে পোস্ট করা কোনও প্রশ্ন নেই যা আপনার নিজের মতোই, আপনি এটি একটি প্রশ্ন হিসাবে ভঙ্গ করতে পারেন এবং নিজের উত্তর দেওয়ার জন্য বাক্সটি চেক করতে পারেন। সেভাবে এটি সাইটে থাকবে এবং লোকেরাও এটির প্রতিক্রিয়া জানাতে পারে।
মেছাফ্ল্যাশ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.