バッチ 遅延環境変数を使ってファイルを1件ずつバックアップする
以下の条件でバックアップをしたいという相談があった。
・Accessファイルのみバックアップしたい
・フォルダの階層はそのまま残したい
・簡単に構成したい
で、以下の構成を考えた。
・バッチ+タスクスケジューラ
・ファイルを1件ずつ取得して、指定ディレクトリにコピー
なので、forでファイルの拡張子を指定して、%%iを置換して、コピー先のパスを生成してやればOK、と思ったが、パスの生成が全然うまくいかない。宣言したはずの変数も出ない。どういうことだと思ったら、「環境変数の即時展開」という制約があり、実行時より前に読み取られてしまうらしい。
で、遅延環境変数の展開を有効化を行うことで、実行時に実行されるように変更する。
CMD.EXEの遅延環境変数の展開 - ふなWikihttp://wa3.i-3-i.info/word12518.html
ファイルのパスの置換はこんな感じで行う。
最終的にこんな感じ
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