• 締切済み

バッチ処理について

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

みんなの回答

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.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)を分けているからではないでしょうか?

ratsbane
質問者

お礼

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

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.4

サーバーBのバッチファイルは全部掲載されていませんよね。(:END のラベルがない) 掲載されている部分全体が、if () else ( ) や for () などの複文内に含まれていませんか?その場合、 %ERRORLEVEL% が先に評価されてしまっている可能性があります。 また net use コマンドのエラー出力も log.txt に記録したいのなら、 if not exist P:\ net use P: \\serverC\test >> log.txt 2>&1 と記載する必要があります。 差し支えなければ、バッチ全体を掲載されてはいかがでしょうか。

ratsbane
質問者

補足

皆様ありがとうございます。 バッチファイルの中身を載せます。 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)
回答No.3

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

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

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)
回答No.1

なによりも、どのような処理をしたいのか、質問文に書いた方がいいですよ。 ファイルが重複したときの処理をどうしたいのか、質問文内に書かれていないので、こちらは想像するしかありません。 この内容だと、文法チェック依頼だと思います。 それから、いままで、どのような切り分けをしたのかも書いて下さい。 例 各処理ごとにPauseを入れてみて確認した 全ての行にログ出力処理を追加し、どこでフリーズしているか確認した 各if文を上下入れ替えても、同じ処理になってしまう elseによる分岐を明記した場合でも同じ 「goto END」に相当するラベルが書かれていないが、書いた場合も同じ(ラベルが無いのが謎ですが) パイプ処理に「|」を使った場合でも変化ないのかどうか

関連するQ&A

  • バッチファイルのループ処理の質問です。

    バッチファイルのループ処理の質問です。 バッチファイルでサーバにセキュリティーパッチをインストールしたいのですが、 一件しかインストール出来ません。 ---------------------------------------------- @echo on setlocal set SrcDir=\\192.168.11.5\temp\ for %%i in (%SrcDir%*.msu) do ( %%i /quiet /norestart >>Instarll_log.log IF ERRORLEVEL 3010 GOTO ReqReboot IF ERRORLEVEL 1 GOTO NG IF ERRORLEVEL 0 GOTO OK :NG echo 異常 >> kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log :OK echo 正常 > kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log :ReqReboot echo 再起動が必要 >> kekka.log echo ERRORLEVELは%ERRORLEVEL%です。 >> kekka.log ) goto END :END endlocal ---------------------------------------------- 続けて次のファイルをインストールするにはどうすれば良いか 教えてください。

  • バッチのcallの使い方で、これって合ってるか教えてください。

    下記のようなバッチスクリプトを作りました。 ************************************** FC AAA.txt BBB.txt if not %errorlevel% EQU 0 call :ERR-SEC 10 FC CCC.txt DDD.txt if not %errorlevel% EQU 0 call :ERR-SEC 11 exit 0 :ERR-SEC echo 終了コード:[%1] > EEE.log exit %1 ************************************** 気にしているのはcallの使い方です。 どこの処理でエラーが起きたかあとでわかるように、 callでエラーセクションをパラメータを渡して呼び出し、 引数をログ出力と終了値に使用しています。 callは本来、2回終わらせる必要があると参考書に記載されていたのですが、 このバッチではexitで無理やり終わらせています。 このような使い方は問題ないでしょうか? なにか気になる点があればぜひ教えてください。 よろしくお願いします。 ちなみにOSはWindows2003Serverです。

  • BATのIF文について質問

    @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です。

  • .bat(バッチ)から.batを実行したいのですがエラーになってしまいます。

    <やりたい事> (1)メニュー的なバッチからOracleインストール後 (2)OracleのDB作成sqlを実行する.bat(バッチ)を実行する。 <現状> メニュー的バッチから(2)をCALLで呼びだすと「内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」とコンソールに表示されてしまいます。 コマンドの拡張子を実行できる設定になっている事は確認できています。 また、コマンドプロンプトから(2)のバッチを実行すると実行できました。 色々と調べて見たのですが原因、解決策が見つかりません。 どうか皆様のお力をお借りできればと思います。 宜しくお願いします。 ↓以下バッチの詳細 <(1)メニュー的なバッチ> ECHO OFF :Start ECHO. ECHO 1. ・・・ 運用APLデータベース設定 %P5% ECHO 99. ・・・ 終了 SET Process= SET Choice= SET /p Choice=Type 選択して下さい。 IF '%Choice%'=='1' GOTO MakeDB :MakeDB REM 5. 運用APLデータベース設定選択時 SET Process=運用APLデータベース設定 ECHO *** "%Process%"開始 *** REM 文字変換バッチ実行 CALL C:\TEMP\aaaa.bat IF ERRORLEVEL 1 GOTO ExceptionError :InputError REM 入力エラー時 ECHO 不正なパラメータが入力されました。 GOTO Start :ExceptionError REM 例外エラー時 ECHO ******** 失敗しました。 ******** GOTO Start :End REM バッチを終了する。 EXIT <(2)OracleのDB作成sqlを実行する.bat(バッチ)> SET ORACLE_INSTALL_DIR=C:\oraclexe SET ORACLE_BIN_DIR=%ORACLE_INSTALL_DIR%\app\oracle\product\10.2.0\server\BIN SET ADMIN_DIR=%ORACLE_INSTALL_DIR%\app\oracle\admin\XE SET ORADATA_DIR=%ORACLE_INSTALL_DIR%\oradata\XE SET DBS_DIR=%ORACLE_INSTALL_DIR%\app\oracle\product\10.2.0\server\dbs SET USERNAME=aaa SET PASSWORD=bbb REM // LOGファイル名用に日付の取得 // FOR /F "tokens=1,2,3 delims=/, " %%i IN ('date /t') DO SET SYSDATE=%%i%%j%%k REM // 「Win31J」に文字変換 // ECHO 文字変換開始 %date% %time% >> "C:\install%SYSDATE%.log" "%ORACLE_BIN_DIR%\sqlplus" %USERNAME%/%PASSWORD% as sysdba @C:\TEMP\Drop.sql >> "C:\install%SYSDATE%.log" IF ERRORLEVEL 1 GOTO ExceptionError ECHO DBユーザー作成開始 %date% %time% >> "C:\install%SYSDATE%.log" "%ORACLE_BIN_DIR%\sqlplus" %USERNAME%/%PASSWORD% as sysdba @C:\TEMP\CreateDB.sql >> "C:\install%SYSDATE%.log" IF ERRORLEVEL 1 GOTO ExceptionError

  • バッチでテキスト内の一覧を検索・処理させてたい

    バッチでテキスト内の一覧を検索・処理させてたい ご質問させて頂きます。 バッチで、フォルダ内の情報をテキストに記述し この記述した内容を検索し、バッチ内で入力したファイル名と 一致させる、入力したファイル名が該当なし場合は、再検索させるたいと 考えています。 テキスト内に記述させたフォルダ情報を検索・(判別)させる方法は、 バッチでないでしょうか? 下記に、バッチを記述します。 ------------------------------------------ dir /w "D:\xxxx\ppp > c:\temp\test.txt :loop set /p failname="- ファイル名入力" ???????? (test.txtを判別) if %errorlevel% GTR 0 (goto non) ELSE goto syo :non echo %failname%はないようです。 goto lop :syo --バッチ処理-- 以上のような、記述を考えておりますが、 ???????? (test.txtを判別)の箇所がわからなく 教授頂けたら幸いです。 よろしくお願い致します。

  • 終了コード errorlevel の考え方について

    こんばんは。 OSはWindowsXP Proを使っています。 テキストファイルに書いてある値を 終了コードにするバッチファイルを作成しました。 以下の2ファイルを同じディレクトリに保存します。 test.txt ┌--------┐   1 └--------┘ test.bat ┌---------------------------------------┐   @echo off   find "0" test.txt   if not errorlevel 1 exit /b 0   find "1" test.txt   if not errorlevel 1 exit /b 1   echo テキストは0~1の値ではありません。   exit /b 2 └---------------------------------------┘ この状態で次のように実行します (1) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT 1 (2) C:\>echo %errorlevel% 1 (3) C:\>set errorlevel=0 (4) C:\>echo %errorlevel% 0 ※ここでtest.txtの中の数字を2にします。 (5) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT テキストは0~1の値ではありません。 (6) C:\>echo %errorlevel% 0 (7) C:\>set errorlevel= (8) C:\>echo %errorlevel% 2 となります。 (2)の結果から、(1)で実行した「exit /b 1」でerrorlevelに1が格納されることが判ります。 しかし、(6)の結果から、(3)で実行した「set errorlevel=0」が (5)で実行した「exit /b 2」より優先されていることが判ります。 しかし(7)でerrorlevelの値を消去したように思われますが、 (8)の結果から、(3)のセットを消去しつつ(5)で実行した「exit /b 2」を記憶しているように見えます。 この挙動について、どのように理解すれば良いのでしょうか。 また「exit /b ○」と「set errorlevel=○」でセットする違いについて教えて頂ければと思います。 お願いします。

  • Virtual PCバッチ起動

    ping で応答しなかったら、バーチャルPCの起動させるというバッチプログラムを 作成しました。しかし、ログオンをして、手動でこのバッチファイルを 開くと動くのですが、タスクスケジューラにのせて実行させても動き ません。素人で申し訳ありませんが、なにがいけないものかご教示 いただけますでしょうか。 --------------------------------------------------- @echo off ping -w 1 -n 1 192.168.0.12 if errorlevel 1 goto error goto END :error "C:\Users\XXXXX\Virtual Machines\XXXXXX1.vmcx" :END ---------------------------------------------------

  • バッチファイル作成でIF ERRORLEVEL 1を使用したのですが・・

    今回初めてバッチファイルを作成しています。 Aをする&Bをする&Cをする IF ERRORLEVEL 1 (エラーに飛ぶ) という文を作ったのですが、この ERRORLEVEL 1ってどこを見てるんでしょうか。直前のCに発生するエラーしかみないのでしょうか。それとも結合文「Aをする&Bをする&Cをする」を見るのでしょうか。 Aをする、Bをする、Cをするのそれぞれに発生するエラーを見つけるにはどうしたら良いのでしょうか。 ヒントでもよいのでアドバイスいただけると助かります。宜しくお願いします。

  • PING一斉送信(Win98で)

    Windows98上でPINGを一斉送信するバッチを作成しています。 いろいろなサイトを見て、手元のXPで以下のバッチを作成し実行するとうまく動作しました。しかし98上で動かしてみたところ、なぜか無限ループになってしまいました。 ----------------------------------------------- @cls @echo PCの応答を調べます。 @ping -n 1 -l 8 192.168.11.5>address.txt @find /c "Request timed out." address.txt>nul @if errorlevel 1 goto A1 @if errorlevel 0 goto A0 @goto END @:A1 @echo 自分のPC:OK @goto END @:A0 @echo 自分のPC:NG @:END @pause (あとはこれは端末の分だけコピペする) ------------------------------------------------ どのようにすれば98上で動くか教えていただくと助かります。よろしくお願いします。

  • IEのバージョンチェックとバージョンアップでBATの簡略化

    IEのバージョンチェックとバージョンアップでBATの簡略化 タイトルの通りで、なんとか仕事で使っている端末のバージョンチェックと 条件に合わない場合、バージョンアップするBATを作りました。 目的の作業は出来ますが、まだまだ勉強不足で簡略化するとしたら どのように短く出来ますか? お時間あるかたいましたらご教授下さい。 @echo off CLS echo IE ver6.0 の場合、IE7.0にアップグレードされます。 echo 実行続けますか? echo 中止:CTRL + C pause rem マウント net use T: \\server\setup$\microsoft\IE echo IEバージョン情報出力 REG QUERY "HKLM\SOFTWARE\Microsoft\Internet Explorer" /v "version" > %temp%\IEverchek.log :XP_SP2 C: CD %temp% find IEverchek.log "6.0.2900.2180" if %ERRORLEVEL% == 0 GOTO verup_start if %ERRORLEVEL% == 1 GOTO XP_SP3 :XP_SP3 C: CD %temp% find IEverchek.log "6.0.2900.5512" if %ERRORLEVEL% == 0 GOTO verup_start if %ERRORLEVEL% == 1 GOTO IE7 :IE7 C: CD %temp% find IEverchek.log "7.0.5730" set message=環境は「IE 7.0 」の環境でした。 if %ERRORLEVEL% == 0 GOTO END if %ERRORLEVEL% == 1 GOTO IE8 :IE8 C: CD %temp% find IEverchek.log "8.0.6001" set message=環境は「IE 8.0 」の環境でした。 if %ERRORLEVEL% == 0 GOTO END if %ERRORLEVEL% == 1 GOTO Error :verup_start for /f "tokens=2 delims=[" %%i in ('ver') do set ver1=%%i for /f "tokens=2" %%i in ('echo %ver1%') do set ver2=%%i for /f "tokens=1-2 delims=. " %%i in ( 'echo %ver2%' ) do set OSVER=%%i.%%j rem -------%OSVER% Win2k=5.00 XP=5.1 XPx64=5.2----------- set OS_TYPE="" if "%OSVER%" == "5.1" set OS_TYPE=32 if "%OSVER%" == "5.2" set OS_TYPE=64 echo installing IE7.0 %OS_TYPE%bit..... echo please wait..... T: start /wait "" "IE7-WindowsXP-x%OS_TYPE%.exe" /passive /forcerestart /update-no goto verupend :Error echo Internet Explorer のレジストリキーが見つかりません。 echo 必要なら手動でインストールしてね。 pause exit :END echo. echo チェックOK echo %message%終了します。 echo. pause exit :verupend echo. echo バージョンアップしました echo. pause exit

専門家に質問してみよう