batによるiniファイルの読み込みとバックアップ方法

このQ&Aのポイント
  • batファイルを使用してiniファイルを読み込み、ログの出力やデータのバックアップを行う方法について教えてください。
  • バックアップはrobocopyを使用して実行します。
  • ご教授いただけると助かります。
回答を見る
  • ベストアンサー

batによるiniの読み込み。

宜しくお願いします。 表題の通りなのですが、batファイルでiniを読み込み、それを基にログの出力やデータのバックアップをするには、どのようにすれば良いのでしょうか? バックアップ方法は、"robocopy"です。 以下に、現状の"bat"と"ini"を記載します。(bat内で処理させたい流れです) #####【backup.bat】##### REM iniファイルの読み込み。 REM 確認できなかったら、異常終了する。 IF NOT EXIST backup.ini ( (echo !date! !time! iniファイル[backup.ini]がありません) exit /b 16 ) REM ログの出力先フォルダチェック。 REM 指定のパスに存在しない場合は、作成する。 IF NOT EXIST %LOG%. ( mkdir %LOG% ) REM バックアップ元/バックアップ先フォルダが存在するか確認する。 REM 確認できなかったら、異常終了する。 REM 異常終了の場合、失敗ログを変数"%LOG%"に出力する。 IF NOT EXIST %FOLDER% %BK_FOLDER% ( (echo !date! !time! 対象フォルダ[%FOLDER% %BK_FOLDER%]がありません。) >> %LOG% SET RTN_CD=16 SET GOTO RTN_END ) ) REM robocopy実行 FOR /F "tokens=1,2" %%A in ('type %INI%') do ( set %FOLDER%=%%A set %BK_FOLDER%=%%B ) robocopy %FOLDER% %BK_FOLDER% /IS /MIR /COPYALL REM robocopyによるバックアップが正常終了したか確認する。 REM 正常終了した場合は、成功ログを変数"%LOG%"に出力する。 "ここはまだ分かりませんので、無視しても構いません。 もし大丈夫でしたら、ご教授お願いします。" #####【backup.ini】##### '#ログの出力先 LOG=D:\log '#バックアップ元フォルダ FORDER="M:\testfolder" '#バックアップ先フォルダ BK_FORDER="Z:\bkupfolder" です。 最近、batファイル等について独学で学び始めたばかりのため困っています。 各サイト等を参照しているのですが、どうしても上手く出来ません。 コマンド操作の理解を少しずつでも深めたいので、お手数をかけますが、ご教授を宜しくお願いします。

noname#138172
noname#138172

質問者が選んだベストアンサー

  • ベストアンサー
  • dscripty
  • ベストアンサー率51% (166/325)
回答No.3

外部ファイルで、変数を設定したいだけなら、下のバッチファイルを作って [init.bat] | Set LOG="D:\log" | Set FORDER="M:\testfolder" | Set BK_FORDER="Z:\bkupfolder" [backup.bat] の始めの方で、 | Call init.bat すればいいだけじゃない? そういうことではなくて、for /F の機能を覚えるためなら、 「コマンド ライン リファレンス」の http://technet.microsoft.com/ja-jp/library/cc778084%28WS.10%29.aspx 「for」 のページの 「反復してファイルを解析する」を良く読み込んでみるといいかも? ちなみに↓を実行すると、 | C:\>for /F "eol=' delims== tokens=1,2" %a in (backup.ini) do @Echo.Set %a=%b こうなる。 | Set LOG=D:\log | Set FORDER="M:\testfolder" | Set BK_FORDER="Z:\bkupfolder" バッチファイルは、下の 6種類のコマンドの機能を覚えれば、一通りできるようになるから、ヘルプをよく読んで、どんな機能があるのかだけでも知っておくといいとおもう。 - Set - Echo - If...Else - For...In...Do - Call/Exit - Setlocal/Endlocal 構文をわすれてもコマンドプロンプトでヘルプを見ればいいだけだからね! | C:\>Set /?

noname#138172
質問者

お礼

dscriptyさん 何度も丁寧な回答ありがとうございます。 どうにかして、iniファイル読み込み後の各処理を実行したいと思っています。 ですが、Callによる外部ファイルを読み込む方法も初めて知り、参考になる部分もありましたので、こちらの方法も検討していきたいと思います。 また、教えていただいたURLとその他の回答も参照して、モジュールを作成できるように試してみたいと思います。(質問自体は受付中にし、当初の方法または他に方法がある回答を確認したいと思います) 色々とありがとうございました。

その他の回答 (2)

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

[ANo.1] の補足に対する回答ね。 > 曖昧な質問内容で ↓質問の意味はもともと明確だけど、 > batによるiniの読み込み。 > 表題の通りなのですが、batファイルでiniを読み込み、 その前にバッチファイルが全然機能してないから、そっちの方が気になるけど、見なかったことにして、 今回の質問の肝となることろは↓ここと | REM robocopy実行 | FOR /F "tokens=1,2" %%A in ('type %INI%') do ( | set %FOLDER%=%%A | set %BK_FOLDER%=%%B | ) と [backup.ini] だけだよね。 これをデバッグ用に処理に Echo を書き加えると、 [backup.bat] | @Echo Off | Set INI=backup.ini | REM robocopy実行 | FOR /F "tokens=1,2" %%A in (%INI%) do ( Rem ← type 不要(※) | Echo.Set FOLDER=%%A | Echo.Set BK_FOLDER=%%B | ) (※ type 不要) ↓ for /? の引用 | FOR /F ["オプション"] %変数 IN (ファイル セット) DO コマンド | [コマンド パラメータ] で、コレを実行すると、 | Set ='#ログの出力先 | Set = | Set =LOG=D:\log | Set = | Set ='#バックアップ元フォルダ | Set = | Set =FORDER="M:\testfolder" | Set = | Set ='#バックアップ先フォルダ | Set = | Set =BK_FORDER="Z:\bkupfolder" | Set = となるけど、本当は、どうさせたい? この Set 文がどうなっていて欲しいのかが重要だよね。

noname#138172
質問者

補足

dscriptyさん 回答ありがとうございます。 補足回答のset文(iniファイル?)の記載についてですが、"ログの出力先"、"バックアップ元フォルダ"、"バックアップ先フォルダ"は、各変数の見分けをつけるためにコメントしておいただけですので、Set 文として成立してほしいのは、 ・LOG=D:\log ・FORDER="M:\testfolder" ・BK_FORDER="Z:\bkupfolder" です。 これらの変数を基に、ログの出力やrobocopyの実行を行いたいです。 このような返信で宜しかったでしょうか? もし、認識違いでしたら申し訳ございません。 お手数をかけますが、確認を宜しくお願いします。

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.1

一度にやって、もどこがうまくいっていないかわからないでしょ? 部分部分が、それぞれ上手く動くかどうか確かめてから、全部をくっつけてバッチファイルを完成させるといいとおもう。 とりあえず、この部分だけ、意図したとおりに動作するか確認してみるね。 | @Echo Off | REM iniファイルの読み込み。 | REM 確認できなかったら、異常終了する。 | IF NOT EXIST backup.ini ( | (echo !date! !time! iniファイル[backup.ini]がありません) | exit /b 16 | ) ↓実行結果。 | C:\>backup.bat | !date! !time! iniファイル[backup.ini]がありません "!date!" と "!time!" がそのまま表示されてるよ? たぶん、日時を出力したいんだとおもうけど、 そのコマンドは、 | C:\>Date /T | 2011/08/05 | | C:\>Time /T | 23:59 で、コマンドの出力結果を変数に入れるには、 | C:\>For /F "tokens=* usebackq" %i In (`コマンド`) Do Set 変数名=%i バッチファイルの中だと | For /F "tokens=* usebackq" %%i In (`コマンド`) Do Set 変数名=%%i だから、 | (echo !date! !time! iniファイル[backup.ini]がありません) ではなくて、 | For /F "tokens=* usebackq" %%i In (`Date /T`) Do Set DATE=%%i | For /F "tokens=* usebackq" %%i In (`Time /T`) Do Set TIME=%%i | Echo.%DATE% %TIME% iniファイル[backup.ini]がありません 実行してみると、 | C:\>backup.bat | 2011/08/06 00:05 iniファイル[backup.ini]がありません こんな感じで、それぞれの部分を確かめてみるといいよ?

noname#138172
質問者

補足

dscriptyさん バッチファイルの組み方についての回答ありがとうございます。 今回の質問の疑問点としては、 ・このbat内で読み込む、iniファイルの中身が現状の記載方法で良いのか? ・その正しいiniファイルを読み込み後の、各処理(ログの出力やrobocopyの実行等)を反映させるためには、どのようなプログラミングを行えば良いのか? が分からないため、今回の質問をさせて頂きました。 曖昧な質問内容で申し訳ございません、大変失礼しました。 もし宜しければ、お手数をかけますが確認をお願いします。

関連するQ&A

  • bat サブルーチンのERRORLEVELについて

    バッチのサブルーチンのERRORLEVELについて質問です。 サブルーチン内でERRORLEVELを返すコマンドを実行したいのですが、 親ルーチンにそのERRORLEVELを共有したくない場合、何か方法はありますか? ============================================================ [1.bat] SET MSG1="NOTFOUND" SET MSG2="found!" echo %ERRORLEVEL% FIND %MSG1% 2.bat REM %ERRORLEVEL%は1に echo %ERRORLEVEL% CALL :LOG echo %ERRORLEVEL% FIND %MSG2% 2.bat REM %ERRORLEVEL%は0に echo %ERRORLEVEL% CALL :LOG echo %ERRORLEVEL% REM %ERRORLEVEL%は0であって欲しいが0に pause EXIT 1 :LOG FIND %MSG1% hogehoge.log REM %ERRORLEVEL%は1に ============================================================ [2.bat] found! ============================================================ [hogehoge.log] 空 ============================================================

  • batファイルの実行について

    batファイルを作成しました。 (ATコマンドにてスケジュールさせたいと考えてます。) ファイル自体をダブルクリックで実行すると正常に処理が完了しますが、コマンドプロンプトから実行しようとすると以下のエラーが発生します。 〓〓〓〓〓〓〓〓〓〓〓〓 C:\>cmd /c "E:\MirroringTool\SimpleFolderMirror\test.bat" 指定した名前は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されません。 〓〓〓〓〓〓〓〓〓〓〓〓 実行させたいbatファイルは以下のとおりです。 〓〓〓〓〓〓〓〓〓〓〓〓 echo off cls rem ↓SimpleFolderMirror.exeを解凍したフォルダ SET EXEFOLDER_PATH="E:\MirroringTool\SimpleFolderMirror\" rem ↓ログの出力フォルダ・ファイル SET LOG_DIR="E:\MirroringTool\SimpleFolderMirror\logs\" rem ↓ミラー元フォルダ1 SET COPY_FROM_PATH_01="S:\" rem ↓ミラー先フォルダ1 SET COPY_TO_PATH_01="E:\ORANT\OWS" cd %EXEFOLDER_PATH% SimpleFolderMirror.exe %COPY_FROM_PATH_01% %COPY_TO_PATH_01% > %LOG_DIR%logs.txt 〓〓〓〓〓〓〓〓〓〓〓〓 cd %EXEFOLDER_PATH%のところまでは処理は完了しているようなので、最後の行のところで発生しているようです。 何が原因でエラーが発生してしまっているのでしょうか? 宜しくお願い致します

  • バッチファイルの環境変数の取り扱い

    robocopyでバックアップログを取るようなバッチファイルをインターネットで調べながら 作成してみました。 今日の日付がついて保存されるのですが、下記のhome用1個だけの時はうまくいったのですが 続けて他のフォルダももう1つ追加しようとしたところ、(4行目から6行目) 1.@rem ログの分別の為の変数設定home用 2.set logfile0m="D:\log\home_log_m\%date:~0,4%-%date:~5,2%-%date:~8,2%_backup.log" 3.robocopy "D:\home" "\\nas001\home" /mir /xa:sh /R:1 /W:2 /FFT /LOG+:"%logfile0m%" 4.@rem ログの分別の為の変数設定folder1用 5.set logfile1m="D:\log\folder1_log_m\%date:~0,4%-%date:~5,2%-%date:~8,2%_backup.log" 6.robocopy "D:\san1" "\\nas001\folder1" /mir /xa:sh /R:1 /W:2 /FFT /LOG+:"%logfile1m%" エラー: 無効なパラメーター #6 : "/LOG+:" と表示されて2個目のrobocopyがうまくいきません。 なぜうまくいかないのか考えてみたのは以下の通りです。 set というのを2つ使っているからうまくいかないのでしょうか? もしも上記のことが原因の場合、1個目のset(logfile1m)というのを無効化するといいのでしょうか? その場合無効(初期化?)の方法はありますか? ネットワークの接続などはうまくできています。 よろしくお願いします

  • batの検証依頼

    現在、batを作成中です。 ターゲットが巨大HDD(2TB)のディスクをbatで読み込んで処理中ですが 処理時間が10分程度必要なのでHDDで何度もトライ&エラーで処理するのは効率的ではありません。 しかも、処理を何度も行うとHDDに負担がかかる。 そこで、以下のコードで問題ないか コードを検証してもらえないでしょうか? 長い文字列(フルパス)が何度も出てきて読みにくいので変数で処理すべきでしょうが 自分のコード作成能力上間違いが少ない方法を選んでいます。 コメントをたくさん入れたのでどんな事をやりたいかはご理解願えると思いますが 不明な点は追加で説明いたします。 コードに不都合な点あれば、修正していただければ幸いです。 ’-------------------------------------------------------------------- REM ドライブレターの全フォルダー名のみを階層を含めて出力 REM ドライブ直下のファイル名(フルパス)の出力にも対応 REM ---------------------------------------------------- @echo off set /p D="ドライブを入力してください <例> x --> " cd /d %D%: REM サーチ先のドライブに移動して以下の作業を行う(書き出しもサーチ先になる) REM -- ドライブレターの全フォルダー名のみを階層を含めて出力 REM -- ドライブ直下のファイル名は出力しない dir /b /ad /s>temp1.txt REM -- /d ドライブ直下のファイル名のみを出力 (a-d ドライブ直下のファイル名のみ出力) dir /b /d >temp2.txt REM ファイル結合してコピー REM C:\UsersTAC_\Desktop\Mp3_MergeDrive\ ---> BATがあるフォルダを表す copy /Y temp2.txt + temp1.txt C:\UsersTAC_\Desktop\Mp3_MergeDrive\temp.txt REM tempファイル削除 del /Q temp1.txt del /Q temp2.txt REM 出力ファイルをソート sort /o C:\UsersTAC_\Desktop\Mp3_MergeDrive\temp.txt C:\UsersTAC_\Desktop\Mp3_MergeDrive\temp.txt rename C:\UsersTAC_\Desktop\Mp3_MergeDrive\temp.txt C:\UsersTAC_\Desktop\Mp3_MergeDrive\FileName_ListUp.txt REM ------------------------------------------------ REM Vol1, Vol2, Vol3という変数にボリューム名をセット set Vol1=K-N set Vol2=456 set Vol3=789 REM IDという変数を空でセット set ID= REM wmicコマンドでHDDのvolumenumberを取得し、findコマンドでVol1, Vol2, Vol3の値を検索 REM errorlevelの値に応じて、IDという変数にX, Y, Zの値をセット wmic logicaldisk get volumename | find "%Vol1%" if errorlevel 0 if not errorlevel 1 set ID=X wmic logicaldisk get volumename | find "%Vol2%" if errorlevel 0 if not errorlevel 1 set ID=Y wmic logicaldisk get volumename | find "%Vol3%" if errorlevel 0 if not errorlevel 1 set ID=Z REM 調査結果の表示、numの値で、serialnumberの中に一致するものがあったため、ID=X,Y,Zを表示。 REM serialnumberの中に一致するものがなかった場合、IDには何もセットせずに表示。 if defined ID ( echo Match found. ID=%ID% ) else ( echo No match found. ID=%ID% REM ドライブを加味したファイル名に変名 if defined ID rename C:\UsersTAC_\Desktop\Mp3_MergeDrive\FileName_ListUp.txt C:\UsersTAC_\Desktop\Mp3_MergeDrive\%ID% _FileName_ListUp.txt cls & echo "終了しました" & pause exit /b

  • batファイルで、call使っても戻ってこない

    こんにちは 教えてほしいことがあります。 batファイルで他のbatファイルを実行するためにcallで呼び出すと、処理がまた戻ってくる事を知り、 以下のようにやってみたのですが、戻ってきている様子がありません。 どこが間違っているのか教えていただければと思います。 以下file-backup.bat echo 処理開始 >> %LOG% date /t >> %LOG% time /t >> %LOG% C:\****\Backup\FastCopy198\fastcopy.exe /cmd=force_copy /auto_close /open_window /error_stop=TRUE /log /from_date="-2D" "D:\file2" "/to=\\********\file2" @echo off call "Z:\file-backup2.bat" echo 処理終了 >> %LOG% ←---これ以下がログファイルに表示されない time /t >> %LOG% echo. >> %LOG% ログに「処理終了」が入ってきませんので、callで戻ってきていないと判断しました。 環境はwinserver2008です。 ご教授お願いします。

  • Win2K8 R2のタスクでバッチが動作しない

    Windows2008 R2のタスクスケジューラでバッチファイルが実行できない状態に陥っています。 環境・状況等は以下のとおりです。 ・バッチファイルを単体で実行させたときには、問題なく実行できる。 ・ネットワーク上のサーバのあるフォルダをrobocopyするジョブ。 ・タスクスケジューラから実行できている他のバッチファイルを流用して作成。(このジョブも別のサーバのバックアップをしている) ・実行結果は、0x1。 ・タスクスケジューラ登録時には、administratorで登録し、パスワードも入れている。 問題のバッチファイルを直接叩いたときには、何のエラーもなく、約3時間要するrobocopyでのバックアップが稼動しますが、 タスクスケジューラに登録して実行しようとすると、タスクスケジューラの履歴をみると、スタートはしているがすぐに終了して おり、バッチファイル内に記述したrobocopyが稼動していないようです。 バッチファイルの内容は ----------------------- @echo off set LOGFILE=c:\bat\fd_backup\backup.log date /t>%LOGFILE% echo 開始時刻>>%LOGFILE% time /t>>%LOGFILE% echo. >>%LOGFILE% echo Run backup.bat>>%LOGFILE% echo. >>%LOGFILE% ROBOCOPY \\server1\backup\ D:\BACKUP\server1-back\ /MIR /NP /FP /TS /COPYALL /TEE /R:0 /LOG+:%LOGFILE% echo. >>%LOGFILE% echo 終了時刻>>%LOGFILE% time /t>>%LOGFILE% ------------------------- もうひとつ登録してあるバッチファイルは、robocopyの全く同じコマンドで、対象としているサーバと保存先やログファイル名が 異なるだけで問題なくタスクとして稼動しています。 ネット上でいろいろと調べてチェックしてみましたが、おかしいところが見当たらず、困っています。 アドバイスよろしくお願い致します。

  • batファイルのxcopyでエラー

    Windows Server2003のバックアップをbatファイルのxcopyを使って行いました。 xcopy F:\...\フォルダ名\*.* L:\BACKUP\フォルダ名 /d /e /c /k /r /h /y > L:\BACKUP\BACKUPLOG\フォルダ名.log そのとき、「コピー中にエラーが起きました。」というメッセージが表示され、正常にコピーできないサブフォルダがありました。 フォルダ名に半角括弧が含まれていることが原因でコピーできなかったと考えているのですが、そのようなことってあるのでしょうか。 しかも、エラーメッセージをほっといたら消えていたので、どこのフォルダだったかわからなくなってしまいました。 バックアップは定期的に行っているのですが、2回目以降はなぜかエラーメッセージが出てきません。 しかもログファイルは上書きされていて、「○○個のファイルがコピーされました。」という旨のメッセージしか書かれていません。 もう一度エラーメッセージを表示させてそのサブフォルダを見つける良い方法があったら、教えてください。 お願いします。

  • power shell の変数について。

    宜しくお願いします。 "power shellで、iniファイルを読み込み、それをrobocopyの値に代入する"プログラムを作成しています。 サイトや、サンプルコード等を参考にしながら、プログラムの作成に取り組んでいるのですが、 想定通りの動きをしてくれません。 以下が現時点のモジュール(.ps1と.ini)です。 #####【実行モジュール(robocopy.ps1)】##### if (!(test-path -pathtype Leaf D:\testmodule\test_ini.ps1)) { $MSG = (get-date -Format "yyyy/MM/dd HH:mm:ss.ff ") + ` "iniファイル無し" write-host $MSG exit 8 } else { . D:\testmodule\test_ini.ps1 } #ここでiniファイルの変数を、robocopyの値($***)に代入する処理を使用するのでしょうか? robocopy $FORDER $BK_FORDER $TXT $XLS /IS /MIR /COPYALL #####【定義ファイル(test.ini)】##### # 対象txt "testsystem.txt" # 対象xls "test.xls" # バックアップ元フォルダパス "M:\testforder" # バックアップ先フォルダパス "W:\bkupforder" 稼働内容としては、 【power shell実行 → iniファイルの読み込み → iniファイルから変数を使用し、robocopyの値($***)に代入し実行】 です。 特に、"iniファイルから変数を使用し、robocopyの値($***)に代入"する方法が分からず困っています。 iniで指定した変数をrobocopyの値に代入し、稼働内容通りに動かすには、 どのようなプログラムを作成すれば良いのでしょうか? お手数をかけますが、ご教授を宜しくお願いします。

  • 差分の バックアップ

    例えば僕はYamadaとします。自分のpcのmy documnetsにあるデータを 手動で.batを起動し、差分のみ LAN上の\\NAS1\svr3\営業部\Yamada のフォルダにバックアップを取ろうとしています。 下のプログラムだと差分だけでなく、全部上書きをしてしまうのですが 何故だか分かりますか? (保存先を変える前はちゃんと差分のみバックアップできてました。) ------- rem backup01.bat if not exist "C:\Documents and Settings\Yamada\My Documents" goto err xcopy "C:\Documents and Settings\Yamada\My Documents" "\\NAS1\svr3\ 営業部\Yamada" /d /e /y echo 正常に終了しました。 goto end :err echo コピー元がありません、フォルダ名を確認してください。 :end pause ------ 宜しくお願いします。

  • batファイルの記述について

    PCにインストールされているMSDEのバックアップをタスクで取得したいと思っています。 いつも、コマンドを手入力して取得しているのですが、batにすることはできないでしょうか。 参考ページとかでも構いませんので、アドバイスを頂ければ幸いです。 ちなみに、下記のように入力しています。 C:\>osql -E 1>backup database database名 to disk="c:\msdebackup\backup.bak" 2>backup database database名_log to disk="c:\msdebackup\backup_log.bak" 3>go 以上、宜しくお願い致します。