6

.cmd ファイルを介してテスト スイートで作成したプログラムを自動化しようとしています。

%errorlevel% を介して、実行したプログラムのリターン コードを取得できます。

私のプログラムには、エラーの種類ごとに特定の戻りコードがあります。

例えば:

1 - そのような理由で失敗したことを意味します

2 - 他の理由で失敗したことを意味します

...

echo FAILED: テスト ケースに失敗しました。エラー レベル: %errorlevel% >> TestSuite1Log.txt

代わりに、どういうわけか言いたい:

echo FAILED: テスト ケースが失敗しました。エラーの理由: lookupError(%errorlevel%) >> TestSuite1Log.txt

これは .bat ファイルで可能ですか? それとも、python/perl のようなスクリプト言語に移行する必要がありますか?

4

6 に答える 6

14

オプションを使用すると、これを非常にきれいに行うことができ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%!

遅延展開の詳細については、コマンド プロンプトでandHELP SETLOCALと入力してください。HELP SET

于 2008-09-24T22:29:37.190 に答える
2

次のコードのようなことができます。エラー レベルの比較は、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
于 2008-09-24T22:23:46.470 に答える
1

サブルーチンを使用すると、まったく同じではありませんが、 goto回避策を使用して変数にテキストを入力することができます。

より強力な言語を使用するために、このテスト スイートがかなり大きくなると、より簡単になる可能性があります。そこでは、Perl や Windows Scripting Host が役に立ちます。

于 2008-09-24T22:17:21.337 に答える
1

はい、通話できます。新しい行で呼び出しを行い、エラーコードを渡します。これはうまくいくはずですが、私はテストしていません。

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: ちょっと誤解しているかもしれませんが、IF も使用できます

于 2008-09-24T22:17:36.920 に答える
1

逆の順序で値をテストし、IFのオーバーロードされた動作を使用します。

@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
于 2008-09-24T22:19:38.163 に答える
0

「IF ERRORLEVEL」ステートメントを使用して、戻りコードに基づいてさまざまなことを行うことができます。

見る:

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

2 番目の質問への回答ですが、Windows のバッチ ファイルは本質的に非常に限られているため、とにかくスクリプト言語を使用することにします。Perl、Python、Ruby などの優れた Windows ディストリビューションがあるので、それらを使用しない理由はありません。個人的には、Windows で Perl スクリプトを作成するのが大好きです。

于 2008-09-24T22:20:44.807 に答える