سؤال

أنا أحاول أن أتمتة برنامج أنا مع اختبار جناح طريق .ملف cmd.

يمكنني الحصول على برنامج جريت عودة رمز عبر %errorlevel%.

البرنامج يحتوي على بعض رموز الإرجاع لكل نوع من الخطأ.

على سبيل المثال:

1 - يعني فشل من أجل هذا السبب

2 - يعني فشل لسبب آخر

...

صدى فشل:اختبار حالة فشل خطأ مستوى:%errorlevel% >> TestSuite1Log.txt

بدلا من ذلك أود أن بطريقة ما أقول:

صدى فشل:اختبار حالة فشل خطأ السبب:lookupError(%errorlevel%) >> TestSuite1Log.txt

هل هذا ممكن مع .bat الملف ؟ أو لا بد من الانتقال إلى لغة البرمجة مثل الثعبان/perl?

هل كانت مفيدة؟

المحلول

يمكنك القيام بذلك بدقة تماما مع ENABLEDELAYEDEXPANSION خيار.هذا يتيح لك استخدام ! كما متغير علامة أن يتم تقييم بعد %.

REM Turn on Delayed Expansion
SETLOCAL ENABLEDELAYEDEXPANSION

REM Define messages as variables with the ERRORLEVEL on the end of the name
SET MESSAGE0=Everything is fine
SET MESSAGE1=Failed for such and such a reason
SET MESSAGE2=Failed for some other reason

REM Set ERRORLEVEL - or run command here
SET ERRORLEVEL=2

REM Print the message corresponding to the ERRORLEVEL
ECHO !MESSAGE%ERRORLEVEL%!

نوع HELP SETLOCAL و HELP SET في موجه الأوامر للحصول على مزيد من المعلومات حول تأخر التوسع.

نصائح أخرى

يمكنك أن تفعل شيئا مثل البرمجية التالية.علما بأن مستوى الخطأ المقارنات يجب أن تكون في تناقص الطلب بسبب cmd شاءت.

setlocal

rem Main script
call :LookupErrorReason %errorlevel%
echo FAILED Test case failed, error reason: %errorreason% >> TestSuite1Log.txt
goto :EndOfScript

rem Lookup subroutine
:LookupErrorReason
  if %%1 == 3 set errorreason=Some reason
  if %%1 == 2 set errorreason=Another reason
  if %%1 == 1 set errorreason=Third reason
goto :EndOfScript

:EndOfScript
endlocal

ليس تماما مثل ذلك ، مع روتين, ولكن يمكنك أيضا ملء متغير مع النص باستخدام غوتو الحل البديل.

قد يكون أسهل إذا كان هذا الاختبار جناح لك ينمو قليلا جدا إلى استخدام لغة أكثر قوة.Perl أو حتى نظام التشغيل Windows Scripting Host يمكن أن تساعدك هناك.

نعم يمكنك استخدام الاتصال.فقط على خط جديد يكون الاتصال با على رمز الخطأ.هذا يجب أن تعمل, ولكن أنا لم تختبر.

C:\Users\matt.MATTLANT>help call
Calls one batch program from another.

CALL [drive:][path]filename [batch-parameters]

  batch-parameters   Specifies any command-line information required by the
                     batch program.

SEDIT:اوري كنت قد يساء فهمها قليلا, ولكن يمكنك استخدام إذا أيضا

اختبار القيم الخاصة بك في ترتيب عكسي واستخدام طاقتها سلوك إذا:

@echo off
myApp.exe
if errorlevel 2 goto Do2
if errorlevel 1 goto do1
echo Success
goto End

:Do2
echo Something when 2 returned
goto End

:Do1
echo Something when 1 returned
goto End

:End

إذا كنت تريد أن تكون أكثر قوة ، قد تتمكن من محاولة شيء من هذا القبيل (كنت تحتاج إلى استبدال %1 %errorlevel لكن من الصعب أن الاختبار بالنسبة لي).سوف تحتاج إلى وضع ملصق على كل خطأ مستوى التعامل مع:

@echo off
echo passed %1
goto Label%1

:Label
echo not matched!
goto end

:Label1
echo One
goto end

:Label2
echo Two
goto end

:end

هنا هو اختبار:

C:\>test
passed
not matched!

C:\>test 9
passed 9
The system cannot find the batch label specified - Label9

C:\>test 1
passed 1
One

C:\>test 2
passed 2
Two

يمكنك استخدام 'إذا ERRORLEVEL بيان أن تفعل أشياء مختلفة استنادا إلى رمز الإرجاع.

انظر:

http://www.robvanderwoude.com/errorlevel.html

ردا على سؤالك الثاني ، أود أن الانتقال إلى استخدام لغة البرمجة على أي حال ، منذ ويندوز الملفات الدفعية هي بطبيعتها محدودة جدا.هناك نظام التوزيع بالنسبة Perl, Python, Ruby, الخ., لذلك لا يوجد سبب عدم استخدامها فعلا.أنا شخصيا أحب القيام بيرل البرمجة على نظام ويندوز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top