あなたが持っているように2行を分離することは非常に難しく、誤解を招きます。この 2 行に問題はありません。
あなたが抱えている問題は、次のような「ブロック」ステートメントにあります
IF ... (something
something
somethinginvolving DIRWHERERUN
)
これは%var%
、コマンドを実行する前に、バッチが any の値をその現在の値に置き換えて、 in を (or または .) の閉じ括弧として誤って)
解釈するためです%Dirwhererun%
。IF
ELSE
FOR
これを克服する方法は"escape"
%dirwhererun%
'sにすることです)
(つまり、その特別な意味を一時的に停止します) - これはキャレットで行われます^
- それ自体が特殊文字です (特別な意味で「次の文字は単なる文字であり、特殊文字ではありません」 ".)
それで - これを行う方法は?
ここにデモンストレーションがあります:
@ECHO OFF setlocal
set "DIRwhereRUN=U:\UNIVERSITY\testSTABLEunstable(WITHrandomBED^)"
SET dir
set DIRwhereRUN=U:\THISWILLBEWRONG(WITHrandomBED^)
SET dir
set DIRwhereRUN=U:\UNIVERSITY\testSTABLEunstable(WITHrandomBED^^)
SET dir
set DIRwhereRUN=U:\UNIVERSITY\testSTABLEunstable(WITHrandomBED)
SET dir
MD %DIRwhereRUN%
PUSHD "%DIRwhereRUN%"
DIR
POPD
SET dirwhererun=%dirwhererun:)=^^)%
SET dir
U:
(私は一時ドライブとして使用していることに注意してください。問題を引き起こしているのは通常の操作ではSET
ないことを示すために、意図的にオリジナルを使用してディレクトリを作成しています)SET
set
パラメータが引用符で囲まれている場合、値は文字どおりに適用されることに注意してください。この形式は、変数に設定された値に行の末尾の空白が含まれないようにするためによく使用されます。
^
は、次では効果がないように見えることset
に注意してください)
。)
SET
3 番目のバージョンでは、キャレットが含まれていますが、1 つだけです。これは、^
エスケープ^
し)
、通常の文字であるためです。
次に、)
装飾されていないものを使用してすべての操作を行います。明らかに、ディレクトリを再作成しようとするとエラーが発生しますが、それはコマンド自体に問題があるからではなく、ディレクトリが既に存在するためです。
示されているように、ディレクトリが一覧表示されるため、PUSHD
は正しく機能します。
最後に、変数を動的に設定する方法があります。おそらく、別の変数名に設定する方がよいでしょう。これは、変数がファイルまたはユーザーからの入力から読み取られる可能性がある場合、つまり文字どおりに指定されない場合に役立ちます。
まあ - 最後ではありません。さらに 2 つの癖: 1 つ目は ではなく によって%
エスケープされ、2 つ目は の最も柔軟な形式のように見えます( の直後の文字は、通常はスペースですが、他の多くの場合があります)。ステートメントブロックメカニズム。^
%
ECHO(
ECHO
ECHO