name_untitledのエッセイ

IT関係で知ったことなどを記事としてあげていきます。内容に不備や質問などあればぜひコメントをよせてください。

バッチ 遅延環境変数を使ってファイルを1件ずつバックアップする

以下の条件でバックアップをしたいという相談があった。

Accessファイルのみバックアップしたい

・フォルダの階層はそのまま残したい

・簡単に構成したい

 

で、以下の構成を考えた。

・バッチ+タスクスケジューラ

・ファイルを1件ずつ取得して、指定ディレクトリにコピー

 

なので、forでファイルの拡張子を指定して、%%iを置換して、コピー先のパスを生成してやればOK、と思ったが、パスの生成が全然うまくいかない。宣言したはずの変数も出ない。どういうことだと思ったら、「環境変数の即時展開」という制約があり、実行時より前に読み取られてしまうらしい。

で、遅延環境変数の展開を有効化を行うことで、実行時に実行されるように変更する。

CMD.EXEの遅延環境変数の展開 - ふなWikihttp://wa3.i-3-i.info/word12518.html

wa3.i-3-i.info

 

ファイルのパスの置換はこんな感じで行う。

 

web.plus-idea.net

最終的にこんな感じ

echo off
set fromPath=C:\Users\XXXX
set toPath=D:\XXXXX
xcopy %fromPath% %toPath% /T
setlocal enabledelayedexpansion
cd /d %fromPath%
for /R %%i in (*.txt) do (
set testStr=%%i
set testStr=!testStr:%fromPath%=%toPath%!
echo from %%i
echo to !testStr!
copy %%i !testStr!
)
endlocal