2017-12-21 7 views
-1

次のバッチファイルを考える:変数の%ProgramFiles

@echo off 
echo %programfiles(x86)% 
set test=%programfiles(x86)% 
echo %test% 
if 0==0 ( 
    set test2=%programfiles(x86)% 
) 
echo %test2% 

出力はとして返されます。

C:\Program Files (x86) 
C:\Program Files (x86) 
C:\Program Files (x86 

通知に不足しているブラケット最後の行

誰かが何が起こったのか、間違って何をしたのか説明できますか?

答えて

1

%programfiles(x86)%を展開すると、それはC:\Program Files (x86)

あなたのコマンドが

なればなりは
if 0==0 (
    set test2=C:\Program Files (x86) 
) 

パーサは、次に、これは

if 0==0 (
    set "test2=%programfiles(x86)%" 
) 

に防止することができる

if 0==0 (
    set test2=C:\Program Files (x86 
) 

として読み取る「」デリミタは、正確な文字列は、SETコマンドの引数として渡されることを確認してください。

1行に1つの文字を入力すると、CMD環境でエラー応答が生成されません。

+0

OMGに答えで説明したように

ソリューションは、二重引用符でコマンドSETの引数を囲むています。私はとてもばかげている。迅速なソリューションをありがとう! – Tinu

1

%programfiles(x86)%があなたのif文の閉鎖を引き起こしたC:\Program Files (x86)なるために解析された(パスの最後の文字があれば閉じ)、である)

あなたは、文字列のその部分を示すために引用符を追加してみてくださいすることができます:

if 0==0 ( 
    set "test2=%programfiles(x86)%" 
) 
0

閉じ括弧がない理由は、@echo offから@echo ONに変更し、コマンドプロンプトウィンドウからこのバッチファイルを実行すると表示されます。

if 0 == 0 (set test2=C:\Program Files (x86) 

Windowsコマンドインタープリタ後に発見された:

IF条件と(で始まるコマンド全体のブロックを使用して、コマンドラインは、次の単一コマンドラインに全く IFコマンドを実行する前に前処理されています前処理段階の間に%programfiles(x86)%C:\Program Files (x86)に置き換えると、二重引用符で囲まれた文字列の内側には閉じ括弧)は含まれません。したがって、Windowsのコマンドインタープリタ)は、C:\Program Files (x86)の中に二重引用符で囲まれていない文字列で囲まれていないため、コマンドブロックの末尾になります。一致する(のない追加の)は単に無視されます。その結果、test2C:\Program Files (x86にのみ割り当てられます。 How to set environment variables with spaces?Why is no string output with 'echo %var%' after using 'set var = text' on command line?

@echo off 
echo %ProgramFiles(x86)% 
set "test=%ProgramFiles(x86)%" 
echo %test% 
if 0 == 0 ( 
    set "test2=%ProgramFiles(x86)%" 
) 
echo %test2% 
関連する問題