আমি কি ডস ব্যাচ ফাইলে আইএফ ব্লক রাখতে পারি?


98

একটি ডস ব্যাচ ফাইলে স্টেটমেন্ট বডি হলে আমাদের কেবল 1 লাইন থাকতে পারে? আমি মনে করি যে আমি কোথাও খুঁজে পেয়েছি যে আমি সি-এর মতো প্রোগ্রামিং ভাষায় ব্যবহৃত ()ইফ ব্লকের জন্য ব্যবহার করতে পারি {}, তবে এটি চেষ্টা করার সময় এটি বিবৃতিগুলি কার্যকর করে না। কোনও ত্রুটির বার্তাও নেই। এটি আমার কোড:

if %GPMANAGER_FOUND%==true(echo GP Manager is up
goto Continue7
)
echo GP Manager is down
:Continue7

আশ্চর্যজনকভাবে আমি ব্যাচের ফাইলটি চালানোর সময় "জিপি ম্যানেজারটি শেষ নয়" বা "জিপি ম্যানেজার ডাউন নেই" মুদ্রিত হয় না।


হতে পারে এটি সাহায্য করতে পারে: কমান্ডউইনডওস
বেচফিলস- ব্র্যাচিং

হ্যাঁ, যে সাহায্য করে। ডস চুষে দেয়। আমি যদি একাধিক বিবৃতি ব্যবহার করতে চাই তবে অন্যথায় আমাকে বিবৃতিগুলির মধ্যে && ব্যবহার করতে হবে? বা আরও মার্জিত উপায় আছে?
হিউ ডার্লিং

উত্তর:


143

আপনি শর্তসাপেক্ষে কার্যকর করতে স্টেটমেন্টগুলির একটি ব্লক তৈরি করতে পারেন। তবে আপনার সিনট্যাক্সটি ভুল। বন্ধনীগুলি অবশ্যই প্রদর্শিত হিসাবে ব্যবহার করা উচিত:

if <statement> (
    do something
) else (
    do something else
)

তবে আমি বিশ্বাস করি না যে else-ifবিবৃতিগুলির জন্য কোনও অন্তর্নির্মিত বাক্য গঠন রয়েছে । ifএটি হ্যান্ডেল করার জন্য আপনার দুর্ভাগ্যক্রমে বিবৃতিগুলির নেস্টেড ব্লক তৈরি করতে হবে ।


দ্বিতীয়ত, এই %GPMANAGER_FOUND% == trueপরীক্ষাটি আমার কাছে অত্যন্ত সন্দেহজনক বলে মনে হয়। পরিবেশের পরিবর্তনশীল কী সেট করা হয়েছে বা আপনি এটি কীভাবে সেট করছেন তা আমি জানি না, তবে আমি খুব সন্দেহ করি যে আপনি যে কোডটি দেখিয়েছেন সে ফলাফলটি আপনি সন্ধান করছেন তা ফল দেবে।


নিম্নলিখিত নমুনা কোডটি আমার পক্ষে ভাল কাজ করে:

@echo off

if ERRORLEVEL == 0 (
    echo GP Manager is up
    goto Continue7
)
echo GP Manager is down
:Continue7

আমার নমুনা কোড সম্পর্কে কয়েকটি নির্দিষ্ট বিবরণ নোট করুন:

  • শর্তাধীন বিবৃতি এবং খোলার প্রথম বন্ধনের মধ্যবর্তী স্থানটি যুক্ত হয়েছে The
  • আমি সেটিং করছি @echo offদেখে রাখার সব কনসোলে মুদ্রিত হিসাবে তারা চালানো বিবৃতি, এবং পরিবর্তে শুধু ঐ যে বিশেষভাবে দিয়ে শুরু আউটপুট দেখতে echo
  • আমি বিল্ট-ইন ERRORLEVELভেরিয়েবলটি কেবল একটি পরীক্ষা হিসাবে ব্যবহার করছি । এখানে আরও পড়ুন

4
% ERRORLEVEL% == 0, যদি অন্য রূপটি সর্বদা সত্য হয় তবে আরও ভাল ব্যবহার করা হয়, কারণ যদি ERRORLEVEL <N> সত্য হয়, যদি ত্রুটিযুক্তর সমান বা বড় হয় <N>, তবে এই ক্ষেত্রে "==" উপেক্ষা করা হবে
jeb

@ জেব: আমি মনে করি আপনি সম্ভবত এই বিষয়টি মিস করেছেন। ব্যবহার ERRORLEVELকরা তার সমস্যার উত্তর নয়। আমি কেবল সঠিক সিনট্যাক্সের উদাহরণ পোস্ট করছিলাম। হয় ফর্মটি এক্ষেত্রে গ্রহণযোগ্য, ঠিক যেমন if 0 == 0বা অন্য কোনও তুচ্ছ প্রকাশ expression তবে প্রকৃতপক্ষে, নিশ্চিত হয়ে নিন যে আপনি পরিবেশের পরিবর্তনশীল %ERRORLEVEL%এবং ERRORLEVELকমান্ড প্রসেসরের অভ্যন্তরের মধ্যে পার্থক্য বুঝতে পেরেছেন । রেমন্ড চেন এটি এই ব্লগে এখানে সুন্দরভাবে ব্যাখ্যা করেছেন ।
কোডি গ্রে

আপনি কি একটি ELSE পেতে পারেন?
xagyg

4
@ মাইথোফেলনের মন্তব্যে যোগ করা, এমনকি কোনও আরইএম বিবৃতিতে একটি আপাতদৃষ্টিতে নিস্পৃহ বন্ধন বন্ধনী ব্লকটি শেষ করবে। উদাহরণস্বরূপ ব্লকের REM This is a comment (or so I thought)মধ্যে ফেলে দেওয়া IFআপনাকে বিচলিত করবে।
rkagerer

4
@ মাইথোফেলন এবং @ আরকাগেরার উভয়ই একটি সাধারণ নিয়মের সুনির্দিষ্ট বিষয়গুলি নির্দেশ করছে যে স্ট্রিংগুলি উদ্ধৃত করা দরকার। আপনার কখনই কোড করা উচিত নয় IF %somevar%==example_string2 এটি সর্বদা কোড হওয়া উচিত তাই IF "value_of_somevar"=="example_string2" IFবিবৃতিতে সিন্ট্যাক্স ত্রুটি সৃষ্টি করে উভয় স্ট্রিং অপারেণ্ডে বিশেষ অক্ষর এড়ানোর জন্য সংকল্পবদ্ধ করুন you আপনি যে মানগুলি সেট করেছেন তা সর্বদা করা উচিত কারণ set "somevar=value_of_somevar" সেই বাক্য গঠনটি আপনাকে পরিবর্তনশীল মানগুলিতে বিশেষ অক্ষরগুলি থেকে বাঁচতে দেয়, দ্রষ্টব্য যে আমি বলছি না set somevar="value_of_somevar"
এড়িয়ে আর

15

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

if %ERRORLEVEL%==0 (
set var1=blue
set var2=cheese
set var3=%var1%_%var2%
)

এটি নিম্নলিখিত মান সহ var3 প্রদান করা উচিত :

blue_cheese

পরিবর্তে ফলন:

_

কারণ সমস্ত 3 টি কমান্ড কোড ব্লক থেকে বেরিয়ে আসার পরে এক সাথে ক্যাশেড এবং কার্যকর করা হয়।

আমি কেবল একটি কমান্ড - গোটো - চালানোর জন্য ব্লকটি পুনরায় লিখে এবং কয়েকটি লেবেল যুক্ত করে এই সমস্যাটি কাটিয়ে উঠতে সক্ষম হয়েছি। এটির ক্লানকি এবং আমি এটি খুব বেশি পছন্দ করি না তবে কমপক্ষে এটি কার্যকর হয়।

if %ERRORLEVEL%==0 goto :error0
goto :endif

:error0
set var1=blue
set var2=cheese
set var3=%var1%_%var2%

:endif

8
বিলম্বিত সম্প্রসারণটি ব্যবহার করা উচিত: ব্যবহার করুন:set var3=!var1!_!var2!
ড্র্যাকোর্যাট

4

এই গোটো গণ্ডগোলের পরিবর্তে, অ্যাম্পারস্যান্ড এবং ডাবল এম্পারস্যান্ড এবং& (শর্তসাপেক্ষে 0 টি ত্রুটিযুক্ত) কমান্ড বিভাজক হিসাবে ব্যবহার করার চেষ্টা করুন।

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

for %%b in (d e f g h i j k l m n o p q r s t u v w x y z) DO (
if exist "%%b:\Backup.cmd" %%b: & CALL "%%b:\Backup.cmd"
)

কেন পৃথিবীতে এই বঞ্চিত? আমার ঠিক এটিই দরকার ছিল।
ggb667

4
@ জিসিবি 676767 - @ স্পষ্ট করে জানান লুইস "একটি" উত্তর লিখেছিলেন যা মূল পোস্টারটির জন্য আইএফ বিবৃতি কেন কাজ করছে না এই সমস্যার সাথে সম্পর্কিত নয়। এটি "ভিনিজিজনসন" এর উত্তর সম্পর্কিত (এটি মূল পোস্টার সমস্যাটিও মিস করেছে)। ।
আর

1

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

    if "%COPYTOOL%" equ "R" (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using RoboCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*"
    %TOOLPATH% %SRCEPATH% %DESTPATH% /copyall %RCLOGSTR% /m /np /r:0 /tee
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Robocopy] %TEMP%\%~n0.TMP %ERRORLEVEL%
) else (
    WWLOGGER.exe "%APPDATA%\WizardWrx\%~n0.LOG" "Using XCopy to make a backup of %USERPROFILE%\My Documents\Outlook Files\*"
    call %TOOLPATH%  "%USERPROFILE%\My Documents\Outlook Files\*" "%USERPROFILE%\My Documents\Outlook Files\_backups" /f /m /v /y
    C:\BIN\ExitCodeMapper.exe C:\BIN\ExitCodeMapper.INI[Xcopy] %TEMP%\%~n0.TMP %ERRORLEVEL%
)

সম্ভবত দুটি বা ততোধিক লাইনের ব্লকগুলি কেবলমাত্র উইন্ডোজ এনটি কমান্ড স্ক্রিপ্টগুলিতে (.CMD ফাইল) প্রযোজ্য, কারণ পুরানো স্কুল ব্যাচের (.BAT) ফাইলগুলিতে সীমাবদ্ধ এমন একটি অ্যাপ্লিকেশনটির প্রোডাকশন স্ক্রিপ্ট ডিরেক্টরি অনুসন্ধান কেবলমাত্র একটি-কমান্ড ব্লক প্রকাশ করেছে revealed । যেহেতু অ্যাপ্লিকেশনটি প্রসারিত রক্ষণাবেক্ষণে চলে গেছে (যার অর্থ আমি এটির সমর্থনে সক্রিয়ভাবে জড়িত নেই), তাই আমি বলতে পারি না কারণ এটি আমার একাধিক লাইনের প্রয়োজন ছিল না, বা আমি তাদের কাজ করতে পারি না।

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


0

কিছুটা দেরি হতে পারে, তবে আশা করি এটি খুব খারাপ হবে:

@echo off 

if %ERRORLEVEL% == 0 (
msg * 1st line WORKS FINE rem You can relpace msg * with any othe operation...
goto Continue1
)
:Continue1
If exist "C:\Python31" (
msg * 2nd line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue2
)
:Continue2
If exist "C:\Python31\Lib\site-packages\PyQt4" (  
msg * 3th line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue3
)
:Continue3
msg * 4th line WORKS FINE rem You can relpace msg * with any othe operation...
    goto Continue4
)
:Continue4
msg * "Tutto a posto" rem You can relpace msg * with any othe operation...
pause
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.