0

最初の2行が読み取られるバッチファイルがあります:

set DIRwhereRUN=C:\UNIVERSITY\testSTABLEunstable(WITHrandomBED)
PUSHD %DIRwhereRUN%

しかし、バッチは機能しません。

という名前のディレクトリを作成し、testSTABLEunstable_WITHrandomBEDそこに自分のものをコピーすると、すべてがスムーズに機能します。ブラケットで動作させる方法はありますか?少なくとも 2 つの理由から、名前を変更したくありません。

4

3 に答える 3

2

あなたが持っているように2行を分離することは非常に難しく、誤解を招きます。この 2 行に問題はありません。

あなたが抱えている問題は、次のような「ブロック」ステートメントにあります

IF ... (something
   something
   somethinginvolving DIRWHERERUN
   )

これは%var%、コマンドを実行する前に、バッチが any の値をその現在の値に置き換えて、 in を (or または .) の閉じ括弧として誤って)解釈するためです%Dirwhererun%IFELSEFOR

これを克服する方法は"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(ECHOECHO

于 2013-05-25T02:49:13.200 に答える
1

( および ) はシェルの特殊文字であるため、エスケープする必要があります。Cmd.exe のエスケープ文字は^です。したがって、次のことができます。

set DIRWHERERUN=C:\UNIVERSITY\testSTABLEunstable^(WITHrandomBED^)

明細書

于 2013-05-24T16:28:27.840 に答える