dポイントプレゼントキャンペーン実施中!

@echo off
cls
set LOGFILE=C:\%COMPUTERNAME%.log
find C:\temp\setting.txt "SERVER01" /I
if %ERRORLEVEL% == 1 GOTO END
if %ERRORLEVEL% == 0 (
set MESSAGE=SEVER01の環境です
echo %MESSAGE%
echo %MESSAGE% >> %LOGFILE%
GOTO SET1
)
:SET1
echo テスト >> %LOGFILE%
:END

こんな簡単なBATを作成してみましたがERRORLEVELが0の時処理されません
(「SEVER01の環境です」がLOGに書き込まれません)
(もちろんsetting.txtには「SERVER01」の文字が入ってます)
(FINDのあと、「echo %errorlevel」を記述して0にもなっているのですが)

IFの構文として間違っていますか?どなたかご教授ください。
OSはWindowsXP SP3 64Bitです。

A 回答 (4件)

バッチファイルでは ( から ) の処理は ( に到達した時点で環境変数が展開され処理されます


簡単に言えば、()の中でsetした環境変数は、()を抜けてからしか有効にならないのです

バッチファイルで以下を実行してみてください
@echo off
(
set MESSAGE=1回目のメッセージ
echo 1回目 %MESSAGE%
)
(
set MESSAGE=2回目のメッセージ
echo 2回目 %MESSAGE%
)
pause>NUL
exit /b


解決方法ですが、
set MESSAGE=SEVER01の環境です
の処理を()の外で、もっと上の方で行う(set LOGFILEの次行辺り)方法が簡単です

遅延環境変数の展開という機能もあり、こちらであれば()内でsetした環境変数を使えますので
気になったら調べてみてください
    • good
    • 0
この回答へのお礼

レス感謝です。

「遅延環境変数の展開」非常に参考になりました。
他会社からもらったBATには遅延環境変数が記述してあり
なぞがようやくとけました。

お礼日時:2011/01/18 19:34

この手のものは、WSH、PowerShellで作成されることをお勧めします。

内容が簡単かどうかではなく、それぞれのシェルやスクリプト実行環境で不得意な所があります。


で、問題の所ですが、No1の方を指示します。

また、回避方法ですが、「findが0意外の時」を拾うほうが確実に動作します。つまり、

@echo off
if ERRORLEVEL == 1 (echo err) else (echo suc)

ですね。findなどが何を返すか、微妙な所があり、全部のケースをためしてみましたか?

その試した結果で、組む必要があります。
    • good
    • 0

実は「環境変数の展開時期の問題」だったりして.


set /?
でヘルプを見るといいかもよ.
    • good
    • 0

>if %ERRORLEVEL% == 1 GOTO END


>if %ERRORLEVEL% == 0 (
if ERRORLEVEL == 1 GOTO END
if ERRORLEVEL == 0 (
のように%ERRORLEVEL%ではなくERRORLEVELではどうでしょうか

参考URL:http://www.atmarkit.co.jp/fwin2k/operation/comma …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!