• 締切済み

コピーバッチの作成について。

コピーバッチの作成について。 現在フォルダのコピーバッチを作成しようと考えています。 ただ、未熟なもので、なかなか難しく、できればご教授していただければと思い、 投稿させていただきました。 尚、現在作成したいコピーバッチは下記となっています。 1. テストPC01に不定期に配置されるフォルダを、テストPC02上にコピーする。 (フォルダ名はTEST20100919という形で、TESTのみ固定で日付が毎回変動する) 1.5 フォルダがない場合はバッチファイル終了。 2. コピー後に、テストPC02の特定のサービスを停止する。 3. テストPC02にコピーした、TEST20100919をTESTにリネームする。 4. 2.で停止したサービスを起動する。 5. テストpc01のコピー元フォルダを削除する。 (また、上記のバッチで実行された内容をログに吐き出させたいと考えています) このような処理をバッチファイルで行うことは可能でしょうか。 可能でしたら、お手数ですがご教授願えないでしょうか。 よろしくお願いいたします。

みんなの回答

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.3

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

#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 )

mikami07
質問者

補足

自分なりに追加・修正したい箇所を記述させて頂きました。 お手数だとは思いますが、ご助言の程よろしくお願い致します。 @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にあるフォルダを削除したいと考えています。

  • utakataXEX
  • ベストアンサー率69% (711/1018)
回答No.1

>このような処理をバッチファイルで行うことは可能でしょうか。 可能です。 ですが、情報が不足し過ぎです。 初質問とお見受けしましたが、こう言う場合は、以下の点を満たして投稿してください。 (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にリネームしたら削除は不要では? ステップ個別の処理はすべてバッチで可能なものばかりです。 まずは補足をお願いします。 長くなってしまったのでバッチのサンプルは次の回答で書きます。

mikami07
質問者

お礼

utakataXEXさん 投稿に対するご助言、バッチのサンプルの作成ありがとうございます。 大変参考になり、これからに役立てていこうと思います。 また、utakataXEXさんのバッチサンプルのご回答を頂きました、 「この回答に補足をつける」に若干自分なりに追加・修正しようと 考えているバッチを書かせて頂きたいと思いますので、ご助言を よろしくお願いします。

mikami07
質問者

補足

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のコピー元フォルダを削除する。 処理としてはこのようになります。

関連するQ&A

  • バッチファイルの作成

    今回はバッチファイルの作成についてよろしくお願いいたします。 自分の端末のAというフォルダに毎月ファイルが作成されます。これをネットーワーク上の違う端末の特定のフォルダーにコピーしたいのです。 Aというフォルダにyyyymmというファイルが毎月できます。 これを翌月になったら\\MR\test の中にコピーする、という事で、例えば 2006年5月には Aのフォルダにある200604というファイルをネットワーク上の\\MR\testにコピーという事です。 毎月決まった日に動作させたいのですがそれはタスクに入れればいいかな、と考えています。 すみませんが、よろしくお願いいたします。

  • 最新日付のファイルをコピーするバッチの作成

    フォルダAの中に 20120615055243test.dat 20120617061203test.dat 20120618062331test.dat のように、年月日時分秒test.dat  という規則で名付けられたファイルがあります。 この中から、最新日付を見つけて フォルダBにコピーするというバッチを作成することが 可能なのでしょうか。 よろしくお願いします。

  • バッチファイルの作成

    お世話になっております。 バッチファイルの作成方法について、只今勉強中です。 現在、毎日行われている作業をバッチファイルで自動化が出来ないか検討しておりますが、バッチファイルの編集に苦戦していて困っております・・・ ---実行したい事--- 0.以下、作業の流れをコマンドプロンプト上で表示する。 1.C:\ツール\batというフォルダに移動する。 2.batフォルダに新しく「file」というフォルダを作成 3.batフォルダ内には「bat_YYYY/MM/DD.txt」という日付のテキストがあり、該当する日付のテキストをコピーしてfileフォルダへ貼り付ける。 4.fileフォルダへ移動する。 ---終了--- 手順を全部書いてしまっているのですが、途中まではバッチファイルの編集をする事が出来ました。しかし、正解しているか不安です。 ご教授の程、宜しく御願い致します。

  • バッチファイルでファイルを置換

    バッチファイルでファイルを置換 あるバッチファイルをダブルクリックすると 特定のファイル名のファイルを置き換えするような事がしたいのです 例えば c:\aaa\test\a.ini d:\test\a.ini というファイルがあったとします どのフォルダ階層にあるかはわからないのですが testフォルダ以下にあるa.iniファイルを a.bakというファイルにリネームして バッチファイルのカレントに置いてあるa.iniファイルを そのフォルダにコピーする test\a.iniファイルがどこにも見つからなければ 該当ファイルが見つかりませんでしたので更新に失敗しました というようなメッセージを出す このようなプログラムをバッチファイルで作成する事は可能でしょうか? バッチファイルの基本コマンドは知っているのですが forとか高度な使い方はよくわからず教えて頂きたいのです よろしくお願い致します

  • ファイルコピーのバッチ作成

    ファイルコピーのバッチ作成 いつもお世話になっております。 1つのファイルを複数のディレクトリー(ネットワーク上から見える端末)にコピーするバッチを 作成したいのですが、上手くいきません。 COPY /Y C:\(デスクトップのパス)\コピーファイル.mdb \コピー先の絶対パス 上のように1つのファイルを1つのクライアントにファイルをコピーするバッチファイルを作成したのですが、コピーされません。 DOSで実行すると"ファイルが見つかりません"と出てしまいます。 カレントディレクトリーの設定だとしたら、 どのような方法がありますでしょうか? 宜しくお願い遺体sます。

  • バッチファイル作成について

    WindowsXP環境で、CD-ROMを入れたら、指定したフォルダにCD-ROM内のファイルをコピーする処理をしたいです。 自分の思考では、AUTORUN.inf と aaa.bat(バッチファイル)で処理をしようと思っています。 ***例*** AUTORUN.inf(ファイル内容) [autorun] open=aaa.bat そこで、バッチファイルどう作成したらよいか全くわかりません・・ バッチファイルやオートランの作成手順等が記載してあるHP等を教えて頂くとありがたいです。 どうかご教授お願い致します。

  • windowsのバッチ作成

    バッチ初心者ですが、質問させてください。 windowsで、下記のバッチを作成しようとしていますが、 うまくいきません。 既存のフォルダは下記の通りです。 c:\test\1 c:\test\2 c:\test\3 この1,2,3のフォルダの1階層下に、それぞれ新規で c:\test\1\1_tmp c:\test\2\2_tmp c:\test\3\3_tmp という、1階層上のフォルダ名に_tmpを付加した フォルダをそれぞれ作成したいのですが、 変数のセットがうまくいきません。 恐らくforでやればよいのかな、というところまでしかわかりません。 どなたかお手数ですが、ご教授願います。

  • バッチファイル作成について

    フォルダにファイルが一つ入っている状態です。このファイル入りのフォルダを連番で1000個までコピーするためのバッチファイルはどのように作成すればよいでしょうか。 できれば参考となる記載をいただけると幸いです。 宜しくお願い致します。

  • サーバからNASにファイルコピーするバッチファイル

    サーバからNASにファイルをコピーするバッチファイルを作成しました。 NASの共有フォルダにアクセス制限を設定し、バッチファイルを実行すると、 「アクセスが拒否されました」のメッセージが出てコピーできません。 バッチファイルの実行アカウントを「system」にしています。 どこが間違っているのでしょうか。 よろしくお願いします。 NAS:バッファローTeraStation :ホスト名→NAS :共有フォルダ名→test ユーザ→test パスワード→password サーバ:Windows2003serverSE ***バッチファイル*** net use S: \\NAS\test "password" /user:test xcopy "C:\test00" "\\NAS\test" net use S: /delete

  • バッチ処理で16進数でファイルを作成したい

    バッチの質問となります。 以下の処理がしたいのですが、プログラミングが苦手でして…。 似たような質問を探したのですが見つかりませんでしたので、質問させて頂きます。 【処理】 バッチを叩くことによって、 フォルダをコピーして、そのフォルダを16進数で出力しようとしてます。、 10進数では作成できたのですが…。 以下の形にしたいです。 コピーしたいフォルダ:C:\test\copy コピー後フォルダ   :C:\test\1               C:\test\2                 ~               C:\test\f               C:\test\10                 ~               C:\test\1f 申し訳ありませんがよろしくお願い致します。

専門家に質問してみよう