লজিকাল অপারেটরগুলি ("এবং", "বা") ডস ব্যাচে


251

ডস ব্যাচের ফাইলগুলিতে আপনি কীভাবে লজিকাল অপারেটরগুলি প্রয়োগ করবেন?


6
আমি আপনার দেখার পরিতোষ জন্য জমা দিন: pi.bat :) thedailywtf.com/Articles/...
স্কট অ্যান্ডারসন

উত্তর:


289

আপনি andনেস্টেড শর্তগুলির সাথে এটি করতে পারেন :

if %age% geq 2 (
    if %age% leq 12 (
        set class=child
    )
)

বা:

if %age% geq 2 if %age% leq 12 set class=child

আপনি orএকটি পৃথক ভেরিয়েবল দিয়ে করতে পারেন :

set res=F
if %hour% leq 6 set res=T
if %hour% geq 22 set res=T
if "%res%"=="T" (
    set state=asleep
)

14
এছাড়াও আপনি শুধু ব্যবহার করতে পারেন set res=বা set res=1এবং তারপর if defined resযা একটু টাইপস বিরুদ্ধে আরো জোরালো হয় এবং স্পষ্টভাবে বিলম্বিত সম্প্রসারণ সক্রিয় না করেও ব্লক এমনকি কাজ করে।
জোয়ে

5
আপনার উত্তরটি কিছুটা উন্নত করার জন্য ... আপনার "যদি" বিবৃতিগুলি স্পষ্টভাবে বাসা
বাঁধার দরকার

সেট = সত্য বা জিনিসটি কেবল নিখরচায়ভাবে কাজ করে না তার পরে কোনও ফাঁকা স্থান না ফেলে রাখার ভয়। এটি ভেরিয়েবলের মধ্যে "সত্য" এর মান সংরক্ষণ করবে ...
রোল্যান্ড পিহলাকাস

1
আপনার বর্ণিত 'বা' শর্তটি চটজলদি এবং বিভিন্ন সংখ্যার জন্য দুর্দান্ত কাজ করে, তবে আমি যদি 2 টি স্বতন্ত্র মান এবং একটি পরিসীমা না দিয়ে তুলনা করি তবে কী হবে? উদাহরণস্বরূপ, যদি এই ফাইলটি বিদ্যমান থাকে বা ফাইলের নাম == ""
বকোয়ারো

1
@ বকোয়ারো, আপনি যে শর্তটি উল্লেখ করেছেন সেগুলি সহ সত্যের জন্য পুনরায় সেট করতে আপনি কোনও শর্ত ব্যবহার করতে পারেন।
প্যাক্সিডিয়াবলো

69

IFবিবৃতি লজিক্যাল অপারেটর সমর্থন করে না ( ANDএবংOR ), ক্যাসকেডিং IFবিবৃতি একটি অন্তর্নিহিত একত্রে ভুলবেন না।

IF Exist File1.Dat IF Exist File2.Dat GOTO FILE12_EXIST_LABEL

যদি File1.Dat এবং File1.Dat উপস্থিত থাকে তবে লেবেলটি ঝাঁপুন FILE12_EXIST_LABEL

আরো দেখুন: IF /?


53

ডি মরগানের আইন কেবল সংযুক্তি ("এবং") এবং অবহেলা ("নয়") ব্যবহার করে বিযুক্তি ("ওআর") কে লজিক্যাল সমতুল্যে রূপান্তর করতে দেয়। এর অর্থ আমরা এক লাইনে বিযুক্তি ("OR") চেইন করতে পারি।

এর অর্থ যদি নাম হয় "ইয়াক্কো" বা "ওয়াক্কো" বা "ডট", তবে "ওয়ার্নার ভাই বা বোন" প্রতিধ্বনি করুন।

set warner=true
if not "%name%"=="Yakko" if not "%name%"=="Wakko" if not "%name%"=="Dot" set warner=false
if "%warner%"=="true" echo Warner brother or sister

এটি প্যাক্সিডিয়াবলোর "ওআর" উদাহরণের আর একটি সংস্করণ, তবে শর্তগুলি এক লাইনে বেঁধে রয়েছে। (নোট যে বিপরীত leqহয় gtr, এবং বিপরীত geqহয় lss।)

set res=true
if %hour% gtr 6 if %hour% lss 22 set res=false
if "%res%"=="true" set state=asleep

6

নিম্নলিখিত উদাহরণগুলি কীভাবে একটি ওয়ান স্টেটমেন্ট তৈরি করতে হয় (ভেরিয়েবলগুলি নির্ধারণের জন্য বা কোনও কমান্ডের জন্য প্যারামিটারগুলি সহ ব্যবহৃত হয়) তা দেখায়।

নোটপ্যাড শুরু করতে এবং সিএমডি উইন্ডোটি বন্ধ করতে:

start notepad.exe & exit

ভেরিয়েবল x, y এবং z এর মানগুলিতে সেট করতে যদি ভেরিয়েবল 'a' এর সমান হয় না।

IF "%a%"=="blah" (set x=1) & (set y=2) & (set z=3)

আশা করি এইটি কাজ করবে!


5

বা সামান্য কৌশলযুক্ত, কিন্তু অত্যধিক না। এখানে একটি উদাহরণ

set var1=%~1
set var2=%~2
::
set or_=
if "%var1%"=="Stack" set or_=true
if "%var2%"=="Overflow" set or_=true
if defined or_ echo Stack OR Overflow

2

আথুল প্রকাশ (বয়সে 16 বছর) আইএফ বিবৃতিতে শর্ত উপেক্ষা করে কীভাবে একটি ওআর পরীক্ষার বাস্তবায়ন করতে হবে এবং তারপরে ELSE ধারাটি কার্যকর করার প্রয়োজনীয় কোডটি স্থান হিসাবে ব্যবহারের জন্য একটি যৌক্তিক ধারণা দিয়েছেন। আমি নিজেই ভেবেছিলাম যে তবে আরও দুটি ধারা থাকতে হবে যেহেতু তিনি দুটি আইএফ স্টেটমেন্ট ব্যবহার করার পরামর্শ দিচ্ছেন, এবং তাই এক্সিকিউটেড কোডটি দুবার লিখতে হবে । যাইহোক, যদি কোনও জিওটিও প্রয়োজনীয় কোডটি ছাড়তে ব্যবহার করা হয় তবে ELSE ক্লজগুলি লেখার পরিবর্তে কার্যকর করার জন্য কোডটি একবার লিখতে হবে ।

আমি কীভাবে একটি ওআর তৈরি করতে আটুল প্রকাশের নেতিবাচক যুক্তিটি প্রয়োগ করব তার একটি পরীক্ষামূলক উদাহরণ এখানে ।

আমার উদাহরণস্বরূপ, কারও কাছে যদি ট্যাঙ্কের লাইসেন্স থাকে বা তারা তাদের সামরিক পরিষেবা করে তবে তারা ট্যাঙ্ক চালানোর অনুমতি পায় । দুটি প্রম্পটে সত্য বা মিথ্যা লিখুন এবং যুক্তি আপনাকে কোনও ট্যাঙ্ক চালাতে দেয় কিনা তা আপনি দেখতে সক্ষম হবেন।

@ECHO OFF
@SET /p tanklicence=tanklicence:
@SET /p militaryservice=militaryservice:

IF /I NOT %tanklicence%==true IF /I NOT %militaryservice%==true GOTO done

ECHO I am driving a tank with tanklicence set to %tanklicence% and militaryservice set to %militaryservice%

:done

PAUSE

2

আপনি যদি একটি বিবৃতিতে if+ AND/ লিখতে আগ্রহী হন ORতবে এর কোনও কিছুই নেই। তবে, আপনি এক লাইনে w / o যে কোনও অতিরিক্ত ভেরিয়েবল এবং ডাব্লু / ও ব্লক সদৃশ (একক কমান্ডের জন্য এবং কোড বিভাগ) চান তা অর্জন করতে আপনি / এবং / স্টেটমেন্টগুলির ifসাথে গ্রুপ করতে পারেন :&&||()if-elseechoTRUEFALSE

@echo off

setlocal

set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND

echo.

set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR

exit /b 0

:IF_OR
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) || ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) || ( echo.FALSE-& type 2>nul ) ) && echo TRUE+

exit /b 0

:IF_AND
( ( if %A% EQU 1 ( type nul>nul ) else type 2>nul ) && ( if %B% EQU 2 ( type nul>nul ) else type 2>nul ) && echo.TRUE+ ) || echo.FALSE-


exit /b 0

আউটপুট :

TRUE+
FALSE-
FALSE-
FALSE-

TRUE+
TRUE+
TRUE+
FALSE-

কৌশলটি typeকমান্ডটিতে রয়েছে যা ড্রপ / সেট করে errorlevelএবং পরবর্তী কমান্ডের পথে পরিচালনা করে।


1

নেগেশন অপারেন্ড চেষ্টা করুন - 'না'!

ঠিক আছে, আপনি যদি নেস্টেড 'যদি ব্যবহার করে' স্টেট স্টেটমেন্টে 'এবং' অপারেশন করতে পারেন তবে 'পূর্ববর্তী উত্তরগুলি দেখুন', তবে আপনি 'যদি না' বা 'অপারেশন করতে' দিয়ে একই জিনিস করতে পারেন।

যদি আপনি এখনও পর্যন্ত ধারণাটি না পেয়ে থাকেন তবে পড়ুন। অন্যথায়, আপনার সময় নষ্ট করবেন না এবং প্রোগ্রামিংয়ে ফিরে আসুন।

যেমন নেস্টেড 'যদি সমস্ত শর্ত সত্য হয় তখনই সন্তুষ্ট হয়, নেস্টেড' যদি না হয় তবেই সন্তুষ্ট হয় যখন সমস্ত শর্তগুলি মিথ্যা থাকে। এটি একটি 'বা' অপরেন্ডের সাথে আপনি যা করতে চান তার সাথে একই রকম, তাই না?

এমনকি নেস্টেড 'যদি না হয়' এর যে কোনও একটি শর্ত সত্য হলে পুরো বিবৃতিটি সন্তুষ্ট থাকে না। অতএব, আপনি যদি আপনার সমস্ত নেস্টেড শর্তগুলি মিথ্যা হয় তবে শর্ত বিবরণীর শিরোনামটি যা করতে হবে তা মনে রেখে আপনি পরিত্যক্ত 'যদি ব্যবহার করতে পারেন'। আপনি আসলে যে দেহটি দিতে চেয়েছিলেন তা অন্য বিবৃতিতে আসতে হবে।

এবং যদি আপনি এখনও এই জিনিসটির রসিকতা না পেয়ে থাকেন তবে দুঃখিত, আমি 16 বছর বয়সী এবং এটিই আমি সবচেয়ে ভাল ব্যাখ্যা করতে পারি।


x = 2 বা x = 3 =>! ! (x = 2 বা x = 3) =>! (x! = 2 এবং x! = 3) আমি মনে করি না যদি প্রয়োজনীয় বাহ্যিক "না" অপারেটর প্রয়োগ করার জন্য কাঠামোটি আপনি সম্পূর্ণ অবহেলা করতে পারেন। 3 বছর কেটে গেছে, অথুল-প্রকাশ, চিন্তাভাবনা?
আজেরোথবিবি

1

এটি নিম্নলিখিতগুলির মতোই সহজ:

এবং> যদি + হয়

if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" *do something*

OR> if // if

set BOTH=0
if "%VAR1%"=="VALUE" if "%VAR2%"=="VALUE" set BOTH=1
if "%BOTH%"=="0" if "%VAR1%"=="VALUE" *do something*
if "%BOTH%"=="0" if "%VAR2%"=="VALUE" *do something*

আমি জানি যে অন্যান্য উত্তর রয়েছে তবে আমি মনে করি খনিটি আরও সাধারণ, এত সহজে বোঝা যায়। আশা করি এটি আপনাকে সহায়তা করবে! ;)


0

একটি বিকল্প হ'ল ইউনিক্স শেলটি সন্ধান করা যা আপনাকে লজিকাল অপারেটর এবং আরও অনেক কিছু দেয়। আপনি যদি সাইগউইন রুটে যেতে না চান তবে আপনি এখানে বোর্ন শেলটির নেটিভ উইন 32 বাস্তবায়ন পেতে পারেন । একটি নেটিভ বাশ এখানে পাওয়া যাবে । আমি নিশ্চিত যে আপনি সহজেই অন্যান্য ভাল বিকল্পগুলি যেমন zsh বা tcsh গুগল করতে পারেন।

কে


4
: আপনি কি অন্য কিছু শেল ব্যবহারের প্রচেষ্টা মধ্য দিয়ে যেতে চলুন তাহলে, অন্তত PowerShell সঙ্গে যেতে microsoft.com/powershell
অন্ধকার

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

3
বিএটি বেশিরভাগ সময়ই যথেষ্ট। ইউনিক্স শেল স্ক্রিপ্টগুলির 90% পিপিএল রাইনের খাঁটি শেল নয় তবে অনেকগুলি কোরিউটিলস, সেড, অ্যাজক ইত্যাদি কল রয়েছে। জিএনইউ উইন্ডোজ সহ অন্যান্য ওএসে ইউনিক্স গিডি প্রয়োগ করেছে। সুতরাং এই getgnuwin32.sourceforge.net cmd.exe / bash / zsh প্লাসটি একবার দেখুন , বেশিরভাগ কার্যক্রমে এটি পর্যাপ্ত হওয়া উচিত। আপনার কাছে BAT / UNIX শেল অভিজ্ঞতা থাকলে তথাকথিত পাওয়ারশেল শেখার কোনও কারণ নেই
MeaCulpa

0

কেবল ওআর অংশটিই জটিল, তবে একটি সাধারণ বুলিয়ান এক্সপ্রেশন সহ নয় বা এটি রয়েছে এবং এর দুর্দান্ত সমাধানটি হ'ল:

REM if A == B OR C == C then yes

(call :strequ A B || call :strequ C C) && echo yes
exit /b

:strequ
if "%1" == "%2" exit /b 0
exit /b 1

-1

অ্যানড্রির উত্তরে সামান্য পরিবর্তন, সদৃশ প্রকারের আদেশগুলি হ্রাস করে:

set "A=1" & set "B=2" & call :IF_AND
set "A=1" & set "B=3" & call :IF_AND
set "A=2" & set "B=2" & call :IF_AND
set "A=2" & set "B=3" & call :IF_AND

echo.

set "A=1" & set "B=2" & call :IF_OR
set "A=1" & set "B=3" & call :IF_OR
set "A=2" & set "B=2" & call :IF_OR
set "A=2" & set "B=3" & call :IF_OR

goto :eof

:IF_OR

(if /i not %A% EQU 1 (
   if /i not %B% EQU 2 (
      echo FALSE-
      type 2>nul
   )
)) && echo TRUE+

goto :eof

:IF_AND


(if /i %A% EQU 1 (
   if /i %B% EQU 2 (
      echo TRUE+
      type 2>nul
   )
)) && echo FALSE-

goto :eof
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.