このバッチファイルを実行バッチファイル内のif節の中のかっこで変数をエスケープする方法はありますか?
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a%
)
inside was unexpected at this time.
エラーが発生します。
a
このエラーを回避する変数をエスケープする方法はありますか?遅れた拡張を使用して
このバッチファイルを実行バッチファイル内のif節の中のかっこで変数をエスケープする方法はありますか?
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a%
)
inside was unexpected at this time.
エラーが発生します。
a
このエラーを回避する変数をエスケープする方法はありますか?遅れた拡張を使用して
利用内容とVARを設定します引用符set "var=content"
とset
の拡張構文を使用することができます
は、 内容が引用されているので、特殊文字は問題ではありません、それはまでコンテンツを使用しています(引用符自体なし)最後の引用
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set "PATH=%a%"
)
使用は(shf301の答えのような)展開を遅らせるだけでなく、メインの範囲に値を転送します。
@echo off
setlocal enabledelayedexpansion
set a=some value with (parentheses) inside
if 1 == 1 (
set "localScope_PATH=!a!"
rem now transfer it to the global scope
FOR /F "delims=" %%A in ("!localScope_PATH!") DO (
endlocal
set "path=%%A"
)
)
この場合、拡張セット構文は不要です。私は、行末の隠れスペースを避けるためにのみ使用しました。
EDIT: 私はSETLOCAL EnableDelayedExpansionと使用と組み合わせることができます!変数の値を評価することを怠惰にする代わりに%を使うのですか?私が試したときに得た)!この時点で予期せぬことでした。
することができますが、それはその後、あなたのパスが拡張あなたがSO:How does the Windows Command Interpreter (CMD.EXE) parse scripts?
を読むことができる仕組みを理解するには)
C:\programs (x86^)
のような目の前にキャレットが含まれてい
@echo off
Setlocal EnableDelayedExpansion
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=!a:^)=^^^)!
set path
)
として、生産コントラです
EDIT2:パスに関するその他の問題(引用符を含む)
これによると、パスに引用符が含まれているときにかっこで別の問題が発生する可能性があります。
path="C:\Program Files (x86)";C:\Program Files (x86)\Skype
この
が許可されているサンプル、でもそれはここに引用符を使用する必要はありませんが、今set "newPath=%path%"
が
set "newPath="C:\Program Files (x86)";C:\Program Files (x86)\Skype"
今少なくとも一つの括弧に展開としては、拡張SET
構文を破壊します引用符で囲まれておらず、コマンドブロックを破ることができます。
しかし、引用符はここでは必要ないので、path変数から引用符をすべて削除するだけで済みます。
set "newPath=%path:"=%"
はそれを修正します:
@echo off
setlocal enabledelayedexpansion
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=!a!
)
遅れ拡張がなければ、ブロックは(if
からエンディング)
に、%%が最初に交換され、その後、ブロックが解析され、実行遅延付き。拡張!a!はブロック解析後には展開されません。したがって、解析ロジックはa
には表示されず、問題は発生しません。
さて、あなたは**ローカル** 'PATH'変数を変更しました。この値をグローバルな範囲に*どのように移すつもりですか? –
私の答えは、グローバルスコープに変数を転送するためのサンプルです – jeb
)
を%a%
に設定してください。 )
をエスケープするためにいくつかの置換を行うことができます。
@echo off
set a=some value with (parentheses) inside
if 1 == 1 (
set PATH=%a:)=^)%
)
これを 'setlocal EnableDelayedExpansion'と組み合わせて、'% 'の代わりに'! 'を使って変数の値を怠惰に評価できますか?私が試したときに ')!今回は予期せぬものでした。 –
あなたはそれを組み合わせることができますが、遅延拡張は特殊文字に対して安全です。 ')' – jeb
私は遅延拡張か私のどちらかの方法を使います。ちょうど意見。 –
'set" var = content "' - 誰が推測できましたか? :) –
*この場合、拡張セット構文は必要ありません。*あなたは説明できますか? –
私はそれが好きです。なぜなら、行末の隠れたスペースの問題を避けるためです。 – jeb