- 締切済み
コピーバッチの作成について。
コピーバッチの作成について。 現在フォルダのコピーバッチを作成しようと考えています。 ただ、未熟なもので、なかなか難しく、できればご教授していただければと思い、 投稿させていただきました。 尚、現在作成したいコピーバッチは下記となっています。 1. テストPC01に不定期に配置されるフォルダを、テストPC02上にコピーする。 (フォルダ名はTEST20100919という形で、TESTのみ固定で日付が毎回変動する) 1.5 フォルダがない場合はバッチファイル終了。 2. コピー後に、テストPC02の特定のサービスを停止する。 3. テストPC02にコピーした、TEST20100919をTESTにリネームする。 4. 2.で停止したサービスを起動する。 5. テストpc01のコピー元フォルダを削除する。 (また、上記のバッチで実行された内容をログに吐き出させたいと考えています) このような処理をバッチファイルで行うことは可能でしょうか。 可能でしたら、お手数ですがご教授願えないでしょうか。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- utakataXEX
- ベストアンサー率69% (711/1018)
#1、#2 です。 Windows2003との事なので、日付の書式が違う事が考えられます。 書式が「曜 YYYY/MM/DD」になるようであれば、日付取得部分は以下のように変更してください。 (2行目で頭の曜日を削除しています) ログファイルの名前も同様の事をしてあげる必要があります。 set todayData=%date:/=% set todayData=TEST%todayData:~2,8% 書式が「YYYY/MM/DD」であれば、#2の回答で書いた、 set todayData=TEST%date:/=% のままでOKです。 サービスが動くPC02でバッチを動かすのであれば、psexec は必要ありません。 通常の net start コマンドでOK。 それと、前便で書いたエラー処理は今回も含めていません。 Win2003同士の処理だと、それなりにミッションクリティカルな業務と思われるので充分なエラー処理が必要です。 最初に net use で接続確立しておく(接続不可ならエラー)など、すべき事はいくらでもあります。 日付フォルダが手動と言う事は、必ずしも%DATE%で処理できない場合もあると言う事ですよね。 今回は書いていませんが、「バッチの引数としてYYYYMMDDを与えて、無い場合は%DATE%を使う」などの修正も必要でしょう。 (処理自体もタスクスケジューラではなく手動なのかな?) 最後のPC01側データの削除については、一応入れましたが「夜間バッチでコピーが失敗」した場合、データがロストする事になるので、これも理想的には「通常は圧縮+リネームだけ」「別のバッチで過去データを自動削除する」にすべきだと思います。 以上、あくまでも「最低限」の処理である事を認識しておいてください。 (QAサイトでは、これぐらいが限度です) @echo off REM 変数定義 ********************************* REM PC02のパス(ローカル) set localDir=C:\testdata\ REM PC01のパス(リモート) set remotetDir=\\PC01\testdata\ REM PC02のログファイルのパス set localLogDir=C:\testdata\log\ REM 対象フォルダのフルパスの生成(バッチ実行日と同じ前提) REM(フォルダ名はTEST20100919という形で、TESTのみ固定で日付が毎回変動する) REM ※日付を処理日当日以外にするなら、引数で与えるような修正が必要 set todayData=TEST%date:/=% set todayDirR=%remotetDir%%todayData% set todayDirL=%localDir%%todayData% REM ログファイルのフルパス生成(TESTYYYYMMDD.log) set localLog=%localLogDir%TEST%date:/=%.log REM リモートサービス起動/停止関連 REM PC01のドメイン/PC01のユーザー set remoteUser=<PC01のドメイン>\<PC01の実行ユーザー> set remotePswd=<実行ユーザーのパスワード> REM メイン処理 ********************************* REM 1.5 リモートの対象フォルダがない場合はバッチファイル終了。 if not exist "%todayDirR%" ( echo %todayData% "フォルダがありません" >> "%localLog%" exit ) REM 1. テストPC01に不定期に配置されるフォルダを、テストPC02上にコピーする。 copy "%todayDirR%" "%localDir%" >> "%localLog%" 2>&1 REM 2. コピー後に、テストPC02の特定のサービスを停止する。 net stop TESTDAEMON >> "%localLog%" 2>&1 REM 3. テストPC02にコピーした、TEST20100919をTESTにリネームする。 ren "%todayDirL%" TEST >> "%localLog%" 2>&1 REM 4. 2.で停止したサービスを起動する。 net start TESTDAEMON >> "%localLog%" 2>&1 REM 5. テストPC01のコピー元フォルダを削除する。 rmdir /s /q "%todayDirR%"
- utakataXEX
- ベストアンサー率69% (711/1018)
#1 です。 長くなってしまったのでバッチのサンプルはこちらで書きます。 ※さすがにこれをすべて自分の環境で検証するのは行き過ぎなので、内容に関しては「リモートまわりは未検証」です。 @echo off REM 変数定義 ********************************* REM PC01のパス set localDir=C:\testdata\ REM PC02のパス set remotetDir=\\PC02\testdata\ REM PC01のログファイルのパス set localLogDir=C:\testdata\log\ REM 対象フォルダのフルパスの生成(バッチ実行日と同じ前提) REM(フォルダ名はTEST20100919という形で、TESTのみ固定で日付が毎回変動する) set todayData=TEST%date:/=% set todayDir=%localDir%%todayData% REM ログファイルのフルパス生成(TESTYYYYMMDD.log) set localLog=%localLogDir%TEST%date:/=%.log REM リモートサービス起動/停止関連 REM PC02のドメイン/PC02のユーザー set remoteUser=<PC02のドメイン>\<PC02の実行ユーザー> set remotePswd=<実行ユーザーのパスワード> REM メイン処理 ********************************* REM 1.5 フォルダがない場合はバッチファイル終了。 if not exist "%todayDir%" ( echo %todayData% "フォルダがありません" >> "%localLog%" exit ) REM 1. テストPC01に不定期に配置されるフォルダを、テストPC02上にコピーする。 copy "%todayDir%" "%remotetDir%" >> "%localLog%" 2>&1 REM 2. コピー後に、テストPC02の特定のサービスを停止する。 psexec \\PC02 -u remoteUser -p remotePswd stop "TESTDAEMON" >> "%localLog%" 2>&1 REM 3. テストPC02にコピーした、TEST20100919をTESTにリネームする。 ren "%todayDir%" TEST >> "%localLog%" 2>&1 REM 4. 2.で停止したサービスを起動する。 psexec \\PC02 -u remoteUser -p remotePswd start "TESTDAEMON" >> "%localLog%" 2>&1 REM 5. テストpc01のコピー元フォルダを削除する。 REM 不要ではないの? 以上です。 あまりにも回答が冗長になってしまうので書きませんでしたが、実際に仕事で使うなら、上記の各ステップの後ろに以下のようなエラー処理を入れる必要があるでしょう。 エラーであるかどうかの判別は、業務に即したものに変えてください。 REM エラー処理 if "%ERRORLEVEL%" == "0" ( REM エラー内容をログに追記して終了 echo "XXXX処理でエラーが発生しました:" %ERRORLEVEL% >> "%log%" exit )
- utakataXEX
- ベストアンサー率69% (711/1018)
>このような処理をバッチファイルで行うことは可能でしょうか。 可能です。 ですが、情報が不足し過ぎです。 初質問とお見受けしましたが、こう言う場合は、以下の点を満たして投稿してください。 (1)実行環境は何か (2)どこまで考えて何がうまく行っていないのか (3)その他、特別な点があればそれも書く (1)については、質問の文面から「多分Windows系だろう」と想像は付きますが、Windows系OSでも種類(Windows2003,XP,Vista,7 etc.)によって日付書式が変わったりするので。 XP以降の後継OSを前提として書きますが、その場合でも日付書式は変わっている可能性がある点に留意してください。 (2)については「まったく何もできていない」と言う前提で書きます。 (3)については、この質問の場合だと ・テストPC01、テストPC02間の通信 ・フォルダ名の日付について ・特定のサービス がそれに該当すると思います。 PC01、PC02間は通常のWindowsの共有でコピー可能な環境なのか、FTPや、さらにセキュアな通信手段が必要な環境なのか。 (テスト環境はWindows共有でいいとしても本番環境も同じ?) そもそもバッチファイルはPC01、02のどちらにおくのか? フォルダ名の日付は、バッチ実行時の日付と同じでよいのか? 特定のサービスと言うのは、コントロールパネル-サービスで起動・停止できるレベルのサービスか? ここでは、「PC01をバッチの起点とする」「PC間はWindows共有」「フォルダ名の日付は、バッチ実行時の日付と同じ」「特定のサービス名を仮にTESTDAEMON」と言う前提で書きます リモートのサービスを起動/停止する方法の一つとしては、Microsoftの Windows Sysinternals の機能でpsexecが提供されています。 psexec関連参考情報 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1117547411 http://alphafocus.cocolog-nifty.com/blog/2010/08/tips-pc-42ed.html 最初に書いておきますが、正直言って「リモートでのサービス停止/起動」などハマリどころ満載の処理になると思います。 バッチを作りなれていないのであれば、なおさらです。自称バッチ達人の自分も、仕事では使った事がありません。 「処理の向きを逆にできないか」(つまりサービスプロセスが動くPC02を起点とするバッチ)を検討した方がいいと思います。 また、書いていて要件上おかしい、と思ったので何点か「こちらの勝手な想像」で書いています。 「フォルダがない場合」と言うのはTEST20100919の事ですよね? 「テストPC02にコピーした、TEST20100919をTESTにリネームする」はPC01上ですよね? 「テストpc01のコピー元フォルダを削除する」コピー元フォルダとは?TEST20100919をTESTにリネームしたら削除は不要では? ステップ個別の処理はすべてバッチで可能なものばかりです。 まずは補足をお願いします。 長くなってしまったのでバッチのサンプルは次の回答で書きます。
お礼
utakataXEXさん 投稿に対するご助言、バッチのサンプルの作成ありがとうございます。 大変参考になり、これからに役立てていこうと思います。 また、utakataXEXさんのバッチサンプルのご回答を頂きました、 「この回答に補足をつける」に若干自分なりに追加・修正しようと 考えているバッチを書かせて頂きたいと思いますので、ご助言を よろしくお願いします。
補足
utakataXEXさん ご回答ありがとうございます。 utakataXEXさんのご助言を参考にさせて頂き、 今後は必要な情報を記載して投稿させて頂ければ と思います。 また、説明足りずなところがあったと思いますので、 補足を記入させていただきます。 OS:WINDOWS2003 バッチの起点:PC02 PC間:Windows共有 フォルダ名の日付:手動にて作成してPC01に配置するので必要ありません。 【処理について】 1. テストPC01に不定期に配置されるフォルダを、テストPC02上にコピーする。 (フォルダ名はTEST20100919という形で、TESTのみ固定で日付が毎回変動する) →テストPC01に配置されるフォルダについては、自動で作成されるのではなく、 手動にて作成し、手動にてテストPC01に不定期にて配置する形です。 1.5 フォルダがない場合はバッチファイル終了。 2. コピー後に、テストPC02の特定のサービスを停止する。 > テストPC02上のTESTフォルダを削除(が不足していました。 すいません。) 3. テストPC02にコピーした、TEST20100919をTESTにリネームする。 →リネームフォルダはテストPC02のものになります。 4. 2.で停止したサービスを起動する。 5. テストpc01のコピー元フォルダを削除する。 処理としてはこのようになります。
補足
自分なりに追加・修正したい箇所を記述させて頂きました。 お手数だとは思いますが、ご助言の程よろしくお願い致します。 @echo off REM 変数定義 ********************************* >REM PC01のパス >set localDir=C:\testdata\ >REM PC02のパス >set remotetDir=\\PC02\testdata\ >REM PC01のログファイルのパス >set localLogDir=C:\testdata\log\ →起点がPC02なので、下記に変更しました。 REM PC01のパス set remotetDir=\\PC01\testdata\ REM PC02のパス set localDir=C:\testdata\ REM PC02のログファイルのパス set localLogDir=C:\testdata\log\ >REM 対象フォルダのフルパスの生成(バッチ実行日と同じ前提) >REM(フォルダ名はTEST20100919という形で、TESTのみ固定で日付が毎回変動する) >set todayData=TEST%date:/=% >set todayDir=%localDir%%todayData% →テストPC01に手動にてTEST****フォルダを配置するので必要無いでしょうか。 REM ログファイルのフルパス生成(TESTYYYYMMDD.log) set localLog=%localLogDir%TEST%date:/=%.log >REM リモートサービス起動/停止関連 >REM PC02のドメイン/PC02のユーザー >set remoteUser=<PC02のドメイン>\<PC02の実行ユーザー> >set remotePswd=<実行ユーザーのパスワード> →起点なのでremoteUserをPC02User/PC02Pswdに変更しました。 REM リモートサービス起動/停止関連 REM PC02のドメイン/PC02のユーザー set PC02User=<PC02のドメイン>\<PC02の実行ユーザー> set PC02Pswd=<実行ユーザーのパスワード> REM メイン処理 ********************************* REM 1.5 フォルダがない場合はバッチファイル終了。 if not exist "%todayDir%" ( echo %todayData% "フォルダがありません" >> "%localLog%" exit ) →どのように変更すればよいでしょうか。 REM 1. テストPC01に不定期に配置されるフォルダを、テストPC02上にコピーする。 copy "%todayDir%" "%remotetDir%" >> "%localLog%" 2>&1 →"%todayDir%" "%remotetDir%" を "%todayDir%TEST????????" "%LocalDir%" で問題ないでしょうか。 (フォルダについては、TEST2010****になります。) REM 2. コピー後に、テストPC02の特定のサービスを停止する。 psexec \\PC02 -u remoteUser -p remotePswd stop "TESTDAEMON" >> "%localLog%" 2>&1 →remoteUser・remotePwdをPC02User・PC02Pwdに変更 >>REN 2.5 テストPC02のTESTフォルダを削除 rmdir /s %localDir%TEST >> "%localLog%" 2>&1 →これで問題ないでしょうか。 REM 3. テストPC02にコピーした、TEST20100919をTESTにリネームする。 ren "%todayDir%" TEST >> "%localLog%" 2>&1 →"%todayDir%" TEST を"%localDir%TEST????????" TEST で問題ないでしょうか。 REM 4. 2.で停止したサービスを起動する。 psexec \\PC02 -u remoteUser -p remotePswd start "TESTDAEMON" >> "%localLog%" 2>&1 →remoteUser・remotePwdをPC02User・PC02Pwdに変更 REM 5. テストpc01のコピー元フォルダを削除する。 REM 不要ではないの? →最後にコピー元のPC01にあるフォルダを削除したいと考えています。