3

私はバッチスクリプティングにかなり慣れていませんが、以前に少しbashスクリプティングを行ったことがあります。私のバッチファイルは別のプログラム(つまりphpunit)を実行し、このプログラムはコマンドプロンプトにいくつかのものを出力します。出力されたものをインターセプトし、それに基づいて決定を下すために、バッチスクリプトを取得するにはどうすればよいでしょうか。たとえば、phpunitは通常「。」を出力します。正常に実行されたテストごとに、失敗したテストごとに「F」。バッチスクリプトでこの出力をキャッチし、「。」が表示されたかどうかに基づいて別のことを行うにはどうすればよいですか。または「F」?

4

3 に答える 3

6

私はあなたの実際の質問に答えないことから始めますが、これらの提案はあなたが解決しようとしている根本的な問題が何であれ役立つかもしれません:

  1. マシンが読みやすい方法でphpunitログの結果を得ることができます。
  2. PHPは、コマンドラインスクリプトを作成するためのBASHの有効な代替手段です。私は単純なものにBASHを使用しますが、数行を超えた場合、またはループを追加したい場合、ifステートメントなど。PHPで適切に実行することにしました。他の人はperlやpythonに手を伸ばすかもしれません。

あなたの特定のケースでは、BASHではなくPHPでそれを行います。これは、複雑な解析が必要になる可能性があるためです。しかし、BASHで簡単なことをする方法を見てみましょう。課題は、出力が次のようになることです。

PHPUnit 3.4.5 by Sebastian Bergmann.

......................................

Time: 10 seconds, Memory: 9.00Mb

OK (38 tests, 660 assertions)

または、次のようになります。

PHPUnit 3.4.5 by Sebastian Bergmann.

............................................................  60 / 380
............................................................ 120 / 380
...............................................S............ 180 / 380
.......S.................................................... 240 / 380
............................................................ 300 / 380
............................................................ 360 / 380
....................

Time: 01:44, Memory: 14.50Mb

OK, but incomplete or skipped tests!
Tests: 380, Assertions: 6546, Skipped: 2.

または、次のようになります。

PHPUnit 3.4.5 by Sebastian Bergmann.

..IF

Time: 0 seconds, Memory: 8.00Mb

There was 1 failure:

1) MyTest::testTemp
Failed asserting that <boolean:false> is true.

/path/to/myTest.php:68

FAILURES!
Tests: 4, Assertions: 5, Failures: 1, Incomplete: 1.

あなたのアプリケーションは、すべてのテストを実行し、何も壊れていないことを確認するための1時間ごとのcronジョブのようなものだと思います。したがって、正規表現を使用して「FAILURES」という単語を探します。

#!/bin/bash

RESULT=`phpunit tests/myTest.php`

if [[ $RESULT =~ FAILURES ]]
then
    echo "Excuse me, Sir, but we have a problem in the unit tests...";echo "$RESULT"
fi

バックティックを使用して出力をキャプチャしています。一部のBASHエキスパートは、$()代わりに使用するように指示します。ここではどちらの方法でも機能します。

....
RESULT=$(phpunit tests/myTest.php)
...
于 2012-07-11T00:00:45.470 に答える
1

他の誰かがたまたま同じ解決策を探している場合、それは次のような方法で達成できます。

setlocal
someprog.exe > temp.txt
set /p PROGOUTPUT= < temp.txt
del temp.txt
REM do something with %PROGOUTPUT% here
endlocal

うまくいけば、これがお役に立てば幸いです。

編集:私はまた、上記の方法を使用することはできますが、DarrenCookが以下に提案したのと同様にPHPを使用してこれを行うことになったことに注意してください。

于 2012-07-10T16:15:43.300 に答える
0

ソリューションに関する1つの注意:someprog.exe空の出力(何もまたは空の行のみ)を生成する場合、SET/ Pステートメントはの値を変更しませんPROGOUTPUT。つまり、変数が存在する場合は、以前の値を保持します。someprogしたがって、そのコードがスクリプトの1回の実行ごとに複数回実行される可能性がある場合は、取得した出力が前の呼び出しではなく、の最新の呼び出しに関連していることを確認する必要があります。

それ以外は、コードは問題ありませんが、FOR /Fループを使用して一時ファイルなしで実行できます。

SETLOCAL
SET PROGOUTPUT=
FOR /F "delims=" %%L IN ('someprog.exe') DO SET "PROGOUTPUT=%%L"
REM do something with %PROGOUTPUT% here
ENDLOCAL

これは、プログラムが1行の出力しか生成しないことを前提としていることに注意してください。

この"delims="パラメーターは、ループコマンドに区切り文字を無視し、行全体を単一の値として扱うように指示します。は%%Lループ変数であり、ループの本体は、この場合は1つのコマンド(次のコマンド)のみで構成されますDO。さらにコマンドを追加する場合は、本文を括弧で囲みます。&コマンドを同じ行に配置する場合は、コマンドをで区切ることができます。または、次のように本文を複数の行に分割することもできます。

FOR /F "delims=" %%L IN ('someprog.exe') DO (
  SET "PROGOUTPUT=%%L"
  do something else
)

プログラムに終了コードを返すように教えることができる場合は、まったく異なるアプローチもあります。可能であれば0、正常な戻りとゼロ以外のコードを使用して、あらゆる種類の失敗を示します。その場合、バッチスクリプトは次のようになります。

someprog.exe && (
  do something in case of "success" (one or more commands)
) || (
  do something in case of "failure" (one or more commands)
)

また、結果を視覚的に示すものとして出力を生成したい場合もあります(バッチスクリプトとは別にプログラムを実行する場合に役立ちます)。バッチスクリプトで実行しているときに出力を非表示にするには、次のアドレスにリダイレクトしNULます。

someprog.exe > NUL && (
...
于 2012-07-10T22:52:06.830 に答える