2011-10-19 15 views

答えて

27
あなたは二つの異なる方法

利用内容と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:"=%" 
+0

'set" var = content "' - 誰が推測できましたか? :) –

+0

*この場合、拡張セット構文は必要ありません。*あなたは説明できますか? –

+0

私はそれが好きです。なぜなら、行末の隠れたスペースの問題を避けるためです。 – jeb

2

はそれを修正します:

@echo off 
setlocal enabledelayedexpansion 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set PATH=!a! 
) 

遅れ拡張がなければ、ブロックは(ifからエンディング)に、%%が最初に交換され、その後、ブロックが解析され、実行遅延付き。拡張!a!はブロック解析後には展開されません。したがって、解析ロジックはaには表示されず、問題は発生しません。

+0

さて、あなたは**ローカル** 'PATH'変数を変更しました。この値をグローバルな範囲に*どのように移すつもりですか? –

+0

私の答えは、グローバルスコープに変数を転送するためのサンプルです – jeb

2

大括弧と変数は、常に混在する痛みです。代わりにサブルーチンを使用します。

@Echo Off 
Set a=some value with (parentheses) inside 
If 1 == 1 Call :SetPath 
Echo %Path% 
Exit /B 

:SetPath 
Set "Path=%a%" 
SetX "Path" "%a%" 
Exit /B 

私はかつて、現在のシェルセッションにSetを使用して、もう1つは将来のシェルセッションのためにシステム全体で設定するSetXを使用して、二回変数を設定します。不要な場合は削除してください。

4

)%a%に設定してください。 )をエスケープするためにいくつかの置換を行うことができます。

@echo off 
set a=some value with (parentheses) inside 
if 1 == 1 (
    set PATH=%a:)=^)% 
) 
+0

これを 'setlocal EnableDelayedExpansion'と組み合わせて、'% 'の代わりに'! 'を使って変数の値を怠惰に評価できますか?私が試したときに ')!今回は予期せぬものでした。 –

+0

あなたはそれを組み合わせることができますが、遅延拡張は特殊文字に対して安全です。 ')' – jeb

+0

私は遅延拡張か私のどちらかの方法を使います。ちょうど意見。 –

関連する問題