আমার কাছে একটি ব্যাচের ফাইল রয়েছে যা বিভিন্ন পরামিতিগুলির সাথে একই এক্সিকিউটেবল কল করে। কোনও কল যদি কোনও স্তরের কোনও ত্রুটি কোড ফেরত দেয় তবে আমি কীভাবে এটি তত্ক্ষণাত বন্ধ করতে পারি?
মূলত, আমি এমএসবিল্ডের সমতুল্য চাই ContinueOnError=false
।
আমার কাছে একটি ব্যাচের ফাইল রয়েছে যা বিভিন্ন পরামিতিগুলির সাথে একই এক্সিকিউটেবল কল করে। কোনও কল যদি কোনও স্তরের কোনও ত্রুটি কোড ফেরত দেয় তবে আমি কীভাবে এটি তত্ক্ষণাত বন্ধ করতে পারি?
মূলত, আমি এমএসবিল্ডের সমতুল্য চাই ContinueOnError=false
।
উত্তর:
errorlevel
একটি if
বিবৃতিতে চেক করুন , এবং তারপরে 0 ব্যতীত অন্য মানগুলির জন্য exit /b
( কেবলমাত্র বি এট্চ ফাইলটি প্রস্থান করুন , পুরো সেন্টিমিডি.এক্সই প্রক্রিয়া নয়)।
same-executable-over-and-over.exe /with different "parameters"
if %errorlevel% neq 0 exit /b %errorlevel%
আপনি যদি ত্রুটিযুক্তির মানটি আপনার ব্যাচের ফাইলের বাইরে প্রচার করতে চান
if %errorlevel% neq 0 exit /b %errorlevel%
তবে এটি যদি ভিতরে থাকে তবে for
এটি কিছুটা জটিল হয়ে ওঠে। আপনার আরও কিছু প্রয়োজন হবে:
setlocal enabledelayedexpansion
for %%f in (C:\Windows\*) do (
same-executable-over-and-over.exe /with different "parameters"
if !errorlevel! neq 0 exit /b !errorlevel!
)
সম্পাদনা: প্রতিটি কমান্ডের পরে আপনাকে ত্রুটিটি পরীক্ষা করতে হবে। সেমিডি.এক্সই / কমান্ড ডটকম ব্যাচে কোনও বৈশ্বিক "ত্রুটি গোটো" নির্মাণের ধরণ নেই। আমি কোডমনকি অনুযায়ী আমার কোডও আপডেট করেছি , যদিও আমি এক্সপি বা ভিস্টায় আমার ব্যাচ-হ্যাকিংয়ের কোনও ক্ষেত্রেই কখনও নেতিবাচক ত্রুটির মুখোমুখি হয়েছি।
neq
) সক্ষম / অক্ষম if not errorlevel 1 exit /B
করা মাইক্রোসফ্ট দ্বারা সমর্থিত নিবন্ধে বর্ণিত নির্দেশ হিসাবে ব্যবহার করার বিষয়ে কিছুই নয়, কমান্ড পুনঃনির্দেশ অপারেটরগুলি ব্যবহার করে if /?
এবং একটি সেন্টিমি উইন্ডোতে চলতে সহায়তা আউটপুটে সহায়তা দেয় । বর্তমান ত্রুটিযুক্তটি (প্রস্থান কোড) এর সাথে ব্যাচ ফাইলের প্রস্থান প্রক্রিয়াকরণে রাখা হয় exit /B
। দ্রষ্টব্য: exit
পরামিতি সহ /B
সক্ষম কমান্ড এক্সটেনশনগুলির প্রয়োজন, দেখুন কোথায় যান: ইওএফ ফিরে আসে?
|| goto :label
প্রতিটি লাইনে যুক্ত করুন এবং তারপরে একটি সংজ্ঞায়িত করুন :label
।
উদাহরণস্বরূপ, এই। সিএমডি ফাইলটি তৈরি করুন:
@echo off
echo Starting very complicated batch file...
ping -invalid-arg || goto :error
echo OH noes, this shouldn't have succeeded.
goto :EOF
:error
echo Failed with error #%errorlevel%.
exit /b %errorlevel%
আরো দেখুন বাইরে থাকা ব্যাচ ফাইল সাবরোটিন সম্পর্কে প্রশ্নও ।
command || (SET ErrorLine=102 && goto :error)
||
এটিই প্রথম স্থানে তৈরি করা হয়েছিল। বিশেষত গোটো নাও হতে পারে, তবে ফলের উল্লিখিত হিসাবে "চেষ্টা করুন, ভুল করে এটি করুন"। আমার প্রশ্নটি কি এটি সমস্ত শূন্য-বহির্গমন কোডের জন্য কাজ করে? শুধুমাত্র ইতিবাচক?
cmd /k exit -1 && echo success || echo fail
- প্রিন্টগুলি ব্যর্থ fail
command || exit /b %errorlevel%
সবচেয়ে কম:
command || exit /b
আপনার যদি প্রয়োজন হয় তবে আপনি প্রস্থান কোডটি সেট করতে পারেন:
command || exit /b 666
এবং আপনি লগ করতে পারেন:
command || echo ERROR && exit /b
%ERRORLEVEL%
আপনি যখন কল করবেন তখন অনুচ্চারিত হয় exit /b
, সুতরাং ত্রুটি কোডটি এগিয়ে দেওয়া হয়
একটি ছোটখাটো আপডেট, আপনার "যদি ত্রুটিযুক্ত 1" এর জন্য নীচে চেকগুলি পরিবর্তন করা উচিত ...
IF %ERRORLEVEL% NEQ 0
এটি কারণ XP এ আপনি ত্রুটি হিসাবে নেতিবাচক সংখ্যা পেতে পারেন। 0 = কোনও সমস্যা নেই, অন্য কিছু সমস্যা।
এবং ডস যেভাবে "IFRRORLEVEL" পরীক্ষা পরিচালনা করে তা মনে রাখবেন। আপনি যে নম্বরটি যাচাই করছেন সেটি যদি সেই নম্বর বা তার চেয়ে বেশি হয় তবে এটি সত্য হবে যদি আপনি নির্দিষ্ট ত্রুটি নম্বরগুলি সন্ধান করতে থাকেন তবে আপনাকে 255 দিয়ে শুরু করতে হবে এবং কাজ করতে হবে।
এখানে BASH এবং উইন্ডোজ সিএমডির জন্য একটি বহুবিদ কর্মসূচী রয়েছে যা একটি সিরিজ কমান্ড চালায় এবং এর মধ্যে কোনওটি ব্যর্থ হলে তা ছেড়ে দেয়:
#!/bin/bash 2> nul
:; set -o errexit
:; function goto() { return $?; }
command 1 || goto :error
command 2 || goto :error
command 3 || goto :error
:; exit 0
exit /b 0
:error
exit /b %errorlevel%
একাধিক প্ল্যাটফর্ম অবিচ্ছিন্ন ইন্টিগ্রেশন স্ক্রিপ্টের জন্য আমি অতীতে এই ধরণের জিনিসটি ব্যবহার করেছি ।
আমি কমান্ডের OR ফর্মটি পছন্দ করি, কারণ আমি তাদের সর্বাধিক পঠনযোগ্য (প্রতিটি কমান্ডের পরে থাকলে তার বিপরীতে) পাই find যাইহোক, এই কাজ করার সহজ উপায়, command || exit /b %ERRORLEVEL%
হয় ভুল ।
এটি কারণ কারণ যখন কোনও লাইন প্রথম ব্যবহৃত হয় তখন তার পরিবর্তে ব্যাচটি ভেরিয়েবলগুলি প্রসারিত করে। এর অর্থ হ'ল command
উপরের লাইনে যদি ব্যর্থ হয়, ব্যাচ ফাইলটি সঠিকভাবে প্রস্থান করে তবে এটি রিটার্ন কোড 0 দিয়ে প্রস্থান করে, কারণ %ERRORLEVEL%
লাইনের শুরুতে এর মান ছিল was স্পষ্টতই, এটি আমাদের স্ক্রিপ্টে অনাকাঙ্ক্ষিত, সুতরাং আমাদের বিলম্বিত প্রসারকে সক্ষম করতে হবে
, যেমন:
SETLOCAL EnableDelayedExpansion
command-1 || exit /b !ERRORLEVEL!
command-2 || exit /b !ERRORLEVEL!
command-3 || exit /b !ERRORLEVEL!
command-4 || exit /b !ERRORLEVEL!
এই স্নিপেট কমান্ডগুলি 1-4 কার্যকর করবে এবং যদি তাদের কোনওটি ব্যর্থ হয় তবে এটি ব্যর্থ কমান্ডের মতোই প্রস্থান কোড সহ প্রস্থান করবে।
আমরা সবসময় ERRORLEVEL এর উপর নির্ভর করতে পারি না, কারণ অনেক সময় বাহ্যিক প্রোগ্রাম বা ব্যাচের স্ক্রিপ্টগুলি প্রস্থান কোড ফেরায় না।
সেক্ষেত্রে আমরা ব্যর্থতার জন্য জেনেরিক চেকগুলি ব্যবহার করতে পারি:
IF EXIST %outfile% (DEL /F %outfile%)
CALL some_script.bat -o %outfile%
IF NOT EXIST %outfile% (ECHO ERROR & EXIT /b)
এবং যদি প্রোগ্রামটি কনসোল করার জন্য কিছু আউটপুট করে তবে আমরা এটিও পরীক্ষা করে দেখতে পারি।
some_program.exe 2>&1 | FIND "error message here" && (ECHO ERROR & EXIT /b)
some_program.exe 2>&1 | FIND "Done processing." || (ECHO ERROR & EXIT /b)
আমি কীভাবে চেষ্টা করেছি তা নয়, এমএসবিল্ড ব্যর্থ হওয়া সত্ত্বেও ত্রুটিটি সর্বদা 0 থাকে। সুতরাং আমি আমার কাজটি তৈরি করেছি:
প্রকল্প তৈরি করুন এবং বিল্ড.লগে লগ সংরক্ষণ করুন
SET Build_Opt=/flp:summary;logfile=Build.log;append=true
msbuild "myproj.csproj" /t:rebuild /p:Configuration=release /fl %Build_Opt%
বিল্ড লগে "0 ত্রুটি" স্ট্রিং অনুসন্ধান করুন, ফলাফলটি ভেরিতে সেট করুন
FOR /F "tokens=* USEBACKQ" %%F IN (`find /c /i "0 Error" Build.log`) DO (
SET var=%%F
)
echo %var%
শেষ অক্ষরটি পান, যা নির্দেশ করে যে কতগুলি লাইনে অনুসন্ধানের স্ট্রিং রয়েছে
set result=%var:~-1%
echo "%result%"
যদি স্ট্রিংটি পাওয়া যায় না, তবে ত্রুটি> 0, বিল্ড ব্যর্থ হয়েছে
if "%result%"=="0" ( echo "build failed" )
এই সমাধানটি ব্যাচ ফাইলের ভেরিয়েবল হিসাবে কমান্ড আউটপুট কীভাবে সেট করতে হয় সে বিষয়ে মেছাফ্ল্যাশের পোস্ট দ্বারা অনুপ্রাণিত হয়েছিল
for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F
। দ্রষ্টব্য: find "0 Error"
এছাড়াও খুঁজে পাবেন 10 Errors
।
@echo off
set startbuild=%TIME%
C:\WINDOWS\Microsoft.NET\Framework\v3.5\msbuild.exe c:\link.xml /flp1:logfile=c:\link\errors.log;errorsonly /flp2:logfile=c:\link\warnings.log;warningsonly || goto :error
copy c:\app_offline.htm "\\lawpccnweb01\d$\websites\OperationsLinkWeb\app_offline.htm"
del \\lawpccnweb01\d$\websites\OperationsLinkWeb\bin\ /Q
echo Start Copy: %TIME%
set copystart=%TIME%
xcopy C:\link\_PublishedWebsites\OperationsLink \\lawpccnweb01\d$\websites\OperationsLinkWeb\ /s /y /d
del \\lawpccnweb01\d$\websites\OperationsLinkWeb\app_offline.htm
echo Started Build: %startbuild%
echo Started Copy: %copystart%
echo Finished Copy: %TIME%
c:\link\warnings.log
:error
c:\link\errors.log