- 締切済み
バッチ処理について
お世話になります。 バッチファイルを作成して、サーバー間でファイルのコピーを行おうと思ってます。 サーバーA:win2003server standerdEditon サーバーB:win2003server standerdEditon サーバーC:win2003server R2 standerdEditon(ServicePack1) A、Bからnet useコマンドでCをマウントしてます A→Cのコピーは大丈夫なのですが、 B→Cでは頻繁にnet useコマンドで失敗します。 サーバーBのバッチファイル if not exist P:\ net use P: \\serverC\test >> log.txt if %ERRORLEVEL% neq 0 echo エラー発生 ERRORLEVEL=%ERRORLEVEL% >> log.txt &goto END if ERRORLEVEL 0 echo 正常終了 >> log.txt のようにしているのですが、エラーなのに、 「エラー発生」がログに出ずに終了してます。 「正常終了」も 「エラー発生」もログに出ないということは、if文で評価されてないように 思うのですが、&gotoで次の処理を飛ばしているので、終了のログは出てます。 説明が不足しておりましたら追加させていただきますので、 なぜこの現象が発生するのかお知恵をお貸しいただければ幸いです。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- pita-gora
- ベストアンサー率70% (102/145)
こんにちは。 > サーバーBのバッチファイル > if not exist P:\ net use P: \\serverC\test >> log.txt > if %ERRORLEVEL% neq 0 echo エラー発生 ERRORLEVEL=%ERRORLEVEL% >> log.txt &goto END > if ERRORLEVEL 0 echo 正常終了 >> log.txt > のようにしているのですが、エラーなのに、 > 「エラー発生」がログに出ずに終了してます。 > 「正常終了」も > 「エラー発生」もログに出ないということは、if文で評価されてないように > 思うのですが、&gotoで次の処理を飛ばしているので、終了のログは出てます。 > 説明が不足しておりましたら追加させていただきますので、 > なぜこの現象が発生するのかお知恵をお貸しいただければ幸いです。 この現象というのは次のどちらの事を言っているのでしょう? (1)B→Cでは頻繁にnet useコマンドで失敗すること (2)「正常終了」も 「エラー発生」もログに出ないということ (1)ならばサーバの設定なども関係してくるのでよくわかりませんが、(2)が疑問ならば、後で掲載された全体のバッチを見る限り、 echo: << ネットワーク接続 >> >> %LOG% if not exist P:\ net use P: \\serverC\test ADMIN /USER:admin >> %LOG% if %ERRORLEVEL% neq 0 echo エラー発生 ERRORLEVEL=%ERRORLEVEL% > %LOG_ERR% &goto END if ERRORLEVEL 0 echo 正常終了 >> %LOG% エラーのログ(error.txt)と、正常のログ(log.txt)を分けているからではないでしょうか?
- pita-gora
- ベストアンサー率70% (102/145)
サーバーBのバッチファイルは全部掲載されていませんよね。(:END のラベルがない) 掲載されている部分全体が、if () else ( ) や for () などの複文内に含まれていませんか?その場合、 %ERRORLEVEL% が先に評価されてしまっている可能性があります。 また net use コマンドのエラー出力も log.txt に記録したいのなら、 if not exist P:\ net use P: \\serverC\test >> log.txt 2>&1 と記載する必要があります。 差し支えなければ、バッチ全体を掲載されてはいかがでしょうか。
補足
皆様ありがとうございます。 バッチファイルの中身を載せます。 serverBにあるバッチファイルですが、serverAのものと同じです。 流れ的には、クライアントからrcmd.exeでこのバッチをキックするというものです。 よろしくお願いします。 serverAからserverCは失敗することはあまりないですが、 serverBからserverCでは、net useのところで落ちてるみたいで、 << ネットワーク接続 >> だけがログに出でて、 << ネットワーク切断 >> のログが出て、終了のログが出ます。 ------------------------ @echo off set HOME=F:\Batch set LOG=%HOME%\log.txt set LOG_ERR=%HOME%\error.txt echo: << 開始日時 >> >> %LOG% date /t >> %LOG% time /t >> %LOG% :ネットワーク接続 echo: >> %LOG% echo: << ネットワーク接続 >> >> %LOG% if not exist P:\ net use P: \\serverC\test ADMIN /USER:admin >> %LOG% if %ERRORLEVEL% neq 0 echo エラー発生 ERRORLEVEL=%ERRORLEVEL% > %LOG_ERR% &goto END if ERRORLEVEL 0 echo 正常終了 >> %LOG% :コピー echo: >> %LOG% echo: << コピー処理 >> >> %LOG% xcopy /d /e /h /r /y "P:\*.*" "D:\copy\*.*" >> %LOG% if %ERRORLEVEL% neq 0 echo コピーでエラー発生 ERRORLEVEL=%ERRORLEVEL% > %LOG_ERR% &goto END if ERRORLEVEL 0 echo 正常終了 >> %LOG% :END echo: >> %LOG% echo: << ネットワーク切断 >> >> %LOG% net use P: /delete >> %LOG% if %ERRORLEVEL% neq 0 echo 切断でエラー発生 ERRORLEVEL=%ERRORLEVEL% > %LOG_ERR% &goto END2 if ERRORLEVEL 0 echo 正常終了 >> %LOG% :END2 echo: >> %LOG% echo: << 終了日時 >> >> %LOG% date /t >> %LOG% time /t >> %LOG% echo: >> %LOG%
- chie65536
- ベストアンサー率41% (2512/6032)
訂正 だれかが「subst P: P:\temp」なんてコマンドを実行してたら は だれかが「subst P: C:\temp」なんてコマンドを実行してたら の間違い
- chie65536
- ベストアンサー率41% (2512/6032)
subst P: /D >> log.txt net use P: /DELETE >> log.txt net use P: \\serverC\test >> log.txt if %ERRORLEVEL% neq 0 echo エラー発生 ERRORLEVEL=%ERRORLEVEL% >> log.txt &goto END if ERRORLEVEL 0 echo 正常終了 >> log.txt に変えてみましょう。 それに「P:が存在しているからと言って、それが目的のサーバーではない可能性」があるので「P:があろうがなかろうが、P:を(substとnet useの双方で)開放し、P:は常に割り当て直す」のが安全です。 質問者さんの元のバッチでは、だれかが「subst P: P:\temp」なんてコマンドを実行してたら、二進も三進も行かなくなります。
- vaio09
- ベストアンサー率37% (756/2018)
なによりも、どのような処理をしたいのか、質問文に書いた方がいいですよ。 ファイルが重複したときの処理をどうしたいのか、質問文内に書かれていないので、こちらは想像するしかありません。 この内容だと、文法チェック依頼だと思います。 それから、いままで、どのような切り分けをしたのかも書いて下さい。 例 各処理ごとにPauseを入れてみて確認した 全ての行にログ出力処理を追加し、どこでフリーズしているか確認した 各if文を上下入れ替えても、同じ処理になってしまう elseによる分岐を明記した場合でも同じ 「goto END」に相当するラベルが書かれていないが、書いた場合も同じ(ラベルが無いのが謎ですが) パイプ処理に「|」を使った場合でも変化ないのかどうか
お礼
ありがとうございます。 そうですね、ログが出ないのは違うファイルに吐くようにしてるからです。 ご指摘ありがとうございます。 質問的には(1)と(2)両方と考えておりました。 ありがとうござました。