[前の記事]« for /L %N in (,,) do ... で"01","02",...のような2ケタの数値を生成するには?
[次の記事][NT系]バックアップ元に存在しないファイルの削除方法 »

関連オンラインソフト配布サイト:
Vector>ダウンロード(top) |>MS-DOSまたは汎用 | >WindowsVista/XP/2000/NT

▲カテゴリー「ERRORLEVEL」索引へ

ERRORLEVELでの条件分岐が意図した結果にならない

904) 条件分岐 JOJI 2003/11/27(木) 14:41


はじめまして。
バッチ作成経験はなしなので皆様に御教授いただきたく
掲示板に書き込ませていただいています。

・処理内容
test.log内に"AAA"という文字列があればkekka.logに
異常を書き込み、終了。
test.log内に"AAA"という文字列がなければkekka.logに
正常を書き込み、終了。

上記のような処理内容なのですが以下に作成したモジュールを
実行すると"AAA"の文字列あるなしに関わらず
「異常」の結果が返ってきます。
訂正個所を御教授願います。
宜しくお願いします。

・モジュール
FIND "AAA" test.log
IF ERRORLEVEL 0 GOTO NG
IF ERRORLEVEL 1 GOTO OK
:NG
echo 異常 > kekka.log
GOTO END
:OK
echo 正常 > kekka.log
GOTO END
:END

905) Re:条件分岐 JOJI 2003/11/27(木) 15:02


>はじめまして。
>バッチ作成経験はなしなので皆様に御教授いただきたく
>掲示板に書き込ませていただいています。

>・処理内容
>test.log内に"AAA"という文字列があればkekka.logに
>異常を書き込み、終了。
>test.log内に"AAA"という文字列がなければkekka.logに
>正常を書き込み、終了。

>上記のような処理内容なのですが以下に作成したモジュールを
>実行すると"AAA"の文字列あるなしに関わらず
>「異常」の結果が返ってきます。
>訂正個所を御教授願います。
>宜しくお願いします。

>・モジュール
>FIND "AAA" test.log
>IF ERRORLEVEL 0 GOTO NG
>IF ERRORLEVEL 1 GOTO OK
>:NG
>echo 異常 > kekka.log
>GOTO END
>:OK
>echo 正常 > kekka.log
>GOTO END
>:END

すみません。
Windowsのバージョンを書き込むのを忘れていました。
windows2000professionalです。


906) Re:条件分岐 ふぇむ 2003/11/27(木) 15:02


>上記のような処理内容なのですが以下に作成したモジュールを
>実行すると"AAA"の文字列あるなしに関わらず
>「異常」の結果が返ってきます。
>訂正個所を御教授願います。

これはおそらく古典的なミスというかよくある誤解で、仕様として IF ERRORLEVEL の判定が「以上」であることが原因だと思います。等号じゃないんですね。

なので、

>IF ERRORLEVEL 0 GOTO NG
>IF ERRORLEVEL 1 GOTO OK

という順序で記述されると、最初の行は errorlevel が 1 の場合でも成り立ってしまって GOTO NG してしまうと思います。


IF ERRORLEVEL 1 GOTO OK
IF ERRORLEVEL 0 GOTO NG

というように、判定順序を数字の大きい方からにすればよいのではないでしょうか。



907) Re2:条件分岐 JOJI 2003/11/27(木) 15:31


早速のレスありがとうござます。

>これはおそらく古典的なミスというかよくある誤解で、仕様として IF ERRORLEVEL の判定が「以上」であることが原因だと思います。等号じゃないんですね。


純粋にERRORLEVELは「=」だと思っておりました。


>IF ERRORLEVEL 1 GOTO OK
>IF ERRORLEVEL 0 GOTO NG

>というように、判定順序を数字の大きい方からにすればよいのではないでしょうか。


上記のように訂正した所、正常に動作致しました。

今後ともお世話になると思いますが宜しくお願いします。
ありがとうございました。



974) Re:条件分岐 あっぴー 2003/12/16(火) 09:40


初カキコです。あっぴーと申します。

if /?でヘルプを見たところ、Win2000のコマンド拡張機能を使うと

コマンド拡張機能を有効にすると、IF は次のように変更されます:

IF [/I] 文字列1 比較演算子 文字列2 コマンド
IF CMDEXTVERSION 番号 コマンド
IF DEFINED 変数 コマンド

比較演算子は、次のいずれかです:

EQU - 等しい
NEQ - 等しくない
LSS - より小さい
LEQ - 以下
GTR - より大きい
GEQ - 以上

とありました。
エラーレベルを以下のようにすると、一致でも判断できそうですね^^

IF %ERRORLEVEL% EQU 0 GOTO OK
IF %ERRORLEVEL% EQU 1 GOTO NG

975) Re2:条件分岐 ふぇむ 2003/12/16(火) 11:34


>エラーレベルを以下のようにすると、一致でも判断できそうですね^^

>IF %ERRORLEVEL% EQU 0 GOTO OK
>IF %ERRORLEVEL% EQU 1 GOTO NG

大小比較もできるわけなので、おっしゃる通り %errorlevel% を使えば IF ERRORLEVEL でできることはカバーできると思います(一致なら個人的には EQU より == の方が直感的にわかりやすくて好きです)。

%errorlevel% が使える環境においては、IF ERRORLEVEL の判定は %errorlevel% が使えなかった時代のなごりみたいなもの(もしくは互換性維持のためのもの)と思ってもよいかもですね。
 
 


カテゴリー「ERRORLEVEL」索引へ

 

カテゴリー一覧

FPCU/FPCDIY QUICK LINK online
この上の各ジャンル名をクリックすると、下のウィンドウが切り替わります▼


=リンク集のインデックスはこちら=

資料書籍

About

2003年11月27日 16:00に投稿されたエントリーのページです。

ひとつ前の投稿は「for /L %N in (,,) do ... で"01","02",...のような2ケタの数値を生成するには?」です。

次の投稿は「[NT系]バックアップ元に存在しないファイルの削除方法」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

This site is powered by Six Apart
Movable Type 3.33-ja
このブログについて | 運営:有限会社メディアポート