変数にパス名を入れてスペースやダブルクォーテーションがある場合の注意点をメモしておく。
■バッチファイルで変数を使う
set 変数名=文字列
文字列がパス名でスペースが含まれる場合、スペースで区切られて別のパラメータとして処理されてしまう。
例えば
set pathA=\dir01\00 category\files
set pathB=\data backup\files
robocopy %pathA% %pathB%
2つの変数のそれぞれにペースがあるため、robocopyを実行すると4つのパラメータを渡したことになる。
これを防ぐためには""を使う。
set pathA="\dir01\00 category\files"
set pathB="\data backup\files"
■変数の文字列を結合する
set 変数名=%変数1%%変数2%
次の場合、問題が発生する。
set pathA="\dir01\00 category"
set pathB="\files"
set pathAB=%pathA%%pathB%
pathAとpathBを””で囲っているため、pathABは「"\dir01\00 category""\files"」となる。
これではcopyやrobocopyにパラメータとして渡すときに正しく処理されない。
解決案①
set pathA=\dir01\00 category
set pathB=\files
set pathAB="%pathA%%pathB%"
変数を結合してから""で囲む。
解決案②
set pathA="\dir01\00 category"
set pathB="\files"
set pathAB=%pathA:~0,-1%%pathB:~1%
結合時に文字列の一部を抜き出す。
上記例では、pathAは先頭(0番)から後ろの1文字前(-1番)までを取るので、後ろの"がなくなる。
同様にpathBは先頭1文字目の後(1番)から最後までを取るので、先頭の"がなくなる。
pathABは「"\dir01\00 category\files"」となる。
解決策③
set pathA="\dir01\00 category"
set pathB="\files"
set pathAB=%pathA%%pathB%
set pathAB=%pathAB:""=%
3行目までは問題のあるままで、4行目で解決させる。
ちょっと強引かもしれないが、""を空のテキストに置き換えてしまう。
解決案④
set pathA=\dir01\00 category
set pathB=\files
set pathAB=%pathA%%pathB%
copy *.* "%pathAB%"
変数に入れるときではなく、命令のパラメータとするときに""で囲う。
おそらく④が標準的な記述方法ではないだろうか。
※コメント投稿者のブログIDはブログ作成者のみに通知されます