ত্রুটির মুখোমুখি হওয়ার পরে আমি কীভাবে ব্যাচের ফাইলটি শেষ করতে পারি?


290

আমার কাছে একটি ব্যাচের ফাইল রয়েছে যা বিভিন্ন পরামিতিগুলির সাথে একই এক্সিকিউটেবল কল করে। কোনও কল যদি কোনও স্তরের কোনও ত্রুটি কোড ফেরত দেয় তবে আমি কীভাবে এটি তত্ক্ষণাত বন্ধ করতে পারি?

মূলত, আমি এমএসবিল্ডের সমতুল্য চাই ContinueOnError=false


2
আপনার স্ক্রিপ্টটি কোন কমান্ড শেলটি চলবে? ডস / উইন 9 এক্স এর কমান্ড.কম বা উইন 2 কে + এর সেন্টিমিডি.এক্সে? যেহেতু এটি বিশ্বকে পৃথক করে তোলে, আপনি কি দয়া করে আপনার প্রশ্নের সম্পাদনায় তা স্পষ্ট করে বলতে পারেন?
মিহাই লিম্বান

উত্তর:


299

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

সম্পাদনা: প্রতিটি কমান্ডের পরে আপনাকে ত্রুটিটি পরীক্ষা করতে হবে। সেমিডি.এক্সই / কমান্ড ডটকম ব্যাচে কোনও বৈশ্বিক "ত্রুটি গোটো" নির্মাণের ধরণ নেই। আমি কোডমনকি অনুযায়ী আমার কোডও আপডেট করেছি , যদিও আমি এক্সপি বা ভিস্টায় আমার ব্যাচ-হ্যাকিংয়ের কোনও ক্ষেত্রেই কখনও নেতিবাচক ত্রুটির মুখোমুখি হয়েছি।


11
পুরো ফাইলটির জন্য একবার এটি বর্ণনা করার কোনও উপায় আছে কি? "ত্রুটি গোটো" বা অনুরূপ কিছু?
জোশ কোডরফ 15

3
নেতিবাচক ত্রুটিযুক্ত তদন্তের জন্য +1। নেতিবাচক ফলাফলের কারণে কোনও স্ক্রিপ্ট চুপচাপ ব্যর্থ হয়েছিল।
devstuff

1
সাবধানতা: সক্ষম করা পর্বটি জটিল এবং এটি যদি / অন্য বা অন্য কোনও ব্লকের জন্যও প্রয়োজন
মার্চএইচ

1
@ সিস্টেম-পাসে প্রথম দুটি 'যদি' দেখানো হয়েছে তাতে কি কোনও পার্থক্য রয়েছে?
সরল ব্যবহারকারী

1
বিলম্বিত সম্প্রসারণ সক্ষম / অক্ষম বা কমান্ড এক্সটেনশনগুলি (প্রয়োজনীয় neq) সক্ষম / অক্ষম if not errorlevel 1 exit /Bকরা মাইক্রোসফ্ট দ্বারা সমর্থিত নিবন্ধে বর্ণিত নির্দেশ হিসাবে ব্যবহার করার বিষয়ে কিছুই নয়, কমান্ড পুনঃনির্দেশ অপারেটরগুলি ব্যবহার করে if /?এবং একটি সেন্টিমি উইন্ডোতে চলতে সহায়তা আউটপুটে সহায়তা দেয় । বর্তমান ত্রুটিযুক্তটি (প্রস্থান কোড) এর সাথে ব্যাচ ফাইলের প্রস্থান প্রক্রিয়াকরণে রাখা হয় exit /B। দ্রষ্টব্য: exitপরামিতি সহ /Bসক্ষম কমান্ড এক্সটেনশনগুলির প্রয়োজন, দেখুন কোথায় যান: ইওএফ ফিরে আসে?
মফি

252

|| 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%

আরো দেখুন বাইরে থাকা ব্যাচ ফাইল সাবরোটিন সম্পর্কে প্রশ্নও


4
এটি বেশিরভাগ শেল স্ক্রিপ্টিং ভাষায় একটি প্রচলিত প্রথা এবং এটি ভালভাবে পড়ে: "এটি করুন বা এটি ব্যর্থ হলে এটি করুন .."
ফাউল

3
আমি লাইন command || (SET ErrorLine=102 && goto :error)
নম্বরটির

1
@ মার্সেলওয়াল্ডেজ ওরোজকো আমার কাছে মনে হয়েছে যে ||এটিই প্রথম স্থানে তৈরি করা হয়েছিল। বিশেষত গোটো নাও হতে পারে, তবে ফলের উল্লিখিত হিসাবে "চেষ্টা করুন, ভুল করে এটি করুন"। আমার প্রশ্নটি কি এটি সমস্ত শূন্য-বহির্গমন কোডের জন্য কাজ করে? শুধুমাত্র ইতিবাচক?
jpmc26

3
@ jpmc26 হ্যাঁ, এটি নিজের কাছে প্রমাণ করুন - cmd /k exit -1 && echo success || echo fail- প্রিন্টগুলি ব্যর্থ fail
পাখি

2
এমনকি লেবেলগুলি এ জাতীয় কিছু দিয়ে এড়াতে পারবেনcommand || exit /b %errorlevel%
জোহানেস ব্রডওয়াল

94

সবচেয়ে কম:

command || exit /b

আপনার যদি প্রয়োজন হয় তবে আপনি প্রস্থান কোডটি সেট করতে পারেন:

command || exit /b 666

এবং আপনি লগ করতে পারেন:

command || echo ERROR && exit /b

4
চান্সে প্রস্থান / খ কি মূল ব্যর্থ প্রস্থান কোডটি ফেরত দেয়?
ফ্র্যাঙ্ক শুইটারম্যান 18

5
@ ফ্র্যাঙ্কশুইটারম্যান, হ্যাঁ, %ERRORLEVEL%আপনি যখন কল করবেন তখন অনুচ্চারিত হয় exit /b, সুতরাং ত্রুটি কোডটি এগিয়ে দেওয়া হয়
বেনোইট ব্লাঞ্চন

24

একটি ছোটখাটো আপডেট, আপনার "যদি ত্রুটিযুক্ত 1" এর জন্য নীচে চেকগুলি পরিবর্তন করা উচিত ...

IF %ERRORLEVEL% NEQ 0 

এটি কারণ XP এ আপনি ত্রুটি হিসাবে নেতিবাচক সংখ্যা পেতে পারেন। 0 = কোনও সমস্যা নেই, অন্য কিছু সমস্যা।

এবং ডস যেভাবে "IFRRORLEVEL" পরীক্ষা পরিচালনা করে তা মনে রাখবেন। আপনি যে নম্বরটি যাচাই করছেন সেটি যদি সেই নম্বর বা তার চেয়ে বেশি হয় তবে এটি সত্য হবে যদি আপনি নির্দিষ্ট ত্রুটি নম্বরগুলি সন্ধান করতে থাকেন তবে আপনাকে 255 দিয়ে শুরু করতে হবে এবং কাজ করতে হবে।


1
উইন্ডোজ স্ট্যান্ডার্ড অভ্যন্তরীণ এবং বাহ্যিক কমান্ডগুলির কোনওটিই কখনও নেতিবাচক মান সহ প্রস্থান করে না। মাইক্রোসফ্ট কোনও প্রোগ্রাম লেখককে একটি নেতিবাচক মান সহ প্রস্থান করার জন্য সতর্ক করে, উদাহরণস্বরূপ সম্পর্কে এমএসডিএন নিবন্ধে এনভায়রনমেন্ট সম্পত্তি । আসলে এটি অবশ্যই সর্বদা খুঁজে বের করতে হবে যে কোন প্রস্থান কোডটি সাফল্যের ক্ষেত্রে কোনও অ্যাপ্লিকেশন ব্যবহার করে এবং কোনটি বিভিন্ন ত্রুটিযুক্ত তা ব্যবহারকারীর প্রত্যাশাগুলিতে নেতিবাচক এমএস উদাহরণের জন্য সাফল্যের সাথে সঙ্কলিত .chm ফাইলের পরে এইচটিএমএল সহায়তা কর্মশালাটি ত্রুটি প্রদান করে দেখুন।
মফি

17

এখানে 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%

একাধিক প্ল্যাটফর্ম অবিচ্ছিন্ন ইন্টিগ্রেশন স্ক্রিপ্টের জন্য আমি অতীতে এই ধরণের জিনিসটি ব্যবহার করেছি ।


10

আমি কমান্ডের 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 কার্যকর করবে এবং যদি তাদের কোনওটি ব্যর্থ হয় তবে এটি ব্যর্থ কমান্ডের মতোই প্রস্থান কোড সহ প্রস্থান করবে।


1

আমরা সবসময় 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)

1

আমি কীভাবে চেষ্টা করেছি তা নয়, এমএসবিল্ড ব্যর্থ হওয়া সত্ত্বেও ত্রুটিটি সর্বদা 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" )

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

এবং https://ss64.com/nt/syntax-substring.html


1
দশের চেয়ে বেশি গণনার জন্য কাজ করে। উত্তম; for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F। দ্রষ্টব্য: find "0 Error"এছাড়াও খুঁজে পাবেন 10 Errors
স্টিফান

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

4
আপনার উত্তরে আরও তথ্য যুক্ত করুন। কেবল কোডের একটি ব্লক খুব কার্যকর নয়।
পাওয়ার্ডবাইআরেঞ্জ

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