プロが教えるわが家の防犯対策術!

お世話になります。
バッチファイルを作成して、サーバー間でファイルのコピーを行おうと思ってます。
サーバー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で次の処理を飛ばしているので、終了のログは出てます。
説明が不足しておりましたら追加させていただきますので、
なぜこの現象が発生するのかお知恵をお貸しいただければ幸いです。
よろしくお願いします。

A 回答 (5件)

こんにちは。



> サーバー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)を分けているからではないでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。
そうですね、ログが出ないのは違うファイルに吐くようにしてるからです。
ご指摘ありがとうございます。
質問的には(1)と(2)両方と考えておりました。
ありがとうござました。

お礼日時:2007/06/04 12:25

サーバー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%

補足日時:2007/06/01 09:26
    • good
    • 0

訂正



だれかが「subst P: P:\temp」なんてコマンドを実行してたら

だれかが「subst P: C:\temp」なんてコマンドを実行してたら
の間違い
    • good
    • 0

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」なんてコマンドを実行してたら、二進も三進も行かなくなります。
    • good
    • 0

なによりも、どのような処理をしたいのか、質問文に書いた方がいいですよ。


ファイルが重複したときの処理をどうしたいのか、質問文内に書かれていないので、こちらは想像するしかありません。
この内容だと、文法チェック依頼だと思います。

それから、いままで、どのような切り分けをしたのかも書いて下さい。


各処理ごとにPauseを入れてみて確認した
全ての行にログ出力処理を追加し、どこでフリーズしているか確認した
各if文を上下入れ替えても、同じ処理になってしまう
elseによる分岐を明記した場合でも同じ
「goto END」に相当するラベルが書かれていないが、書いた場合も同じ(ラベルが無いのが謎ですが)
パイプ処理に「|」を使った場合でも変化ないのかどうか
    • good
    • 0

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