2017-02-04 6 views
2

内ここで期待どおりに動作しません抜粋です:は「)」を使用してバッチファイルであれば/ else文

set MYMACHINENAME=BuildmasterW32 

if "%MYMACHINENAME%"=="BuildmasterW32" (
    set PROGRAMFILESDIR=D:\Program Files 
    set WISEDIR=D:\Program Files\Wise Installation Studio\WiseScript Package Editor 
) 

if "%MYMACHINENAME%"=="BuildmasterW64" (
    set PROGRAMFILESDIR=C:\Program Files (x86) 
    set WISEDIR="C:\Program Files (x86)\Wise Installation Studio\WiseScript Package Editor" 
) 

set WISEDIR 
rem we see `C:\Program Files (x86)\Wise Installation Studio\WiseScript Package Editor` at this point 
pause 

私が代わりにD:\Program Files...値を見ることを期待したいです。

これは、前の行のPROGRAMFILESDIRを設定する閉じ括弧が条件文を閉じ、WISEDIRの値が上書きされるためです。

PROGRAMFILESDIRの値を二重引用符で囲んだ場合、コードは正しく機能しますが、BUT PROGRAMFILESDIRは"C:\Program Files (x86)"(引用符は変数になります)で、C:\Program Files (x86)ではなくなります。 PROGRAMFILESDIRは後で相対パスが追加されるプレフィックスであるため、値に引用符が含まれていない必要があります。

PROGRAMFILESDIRの割り当て行に)の前にバックスラッシュを追加しようとしましたが、これは効果がないようです。

私が提供しているスニペットには解決策がありますか、if/elseではなくgotoを使用するように書き直す必要がありますか?

+0

良い答えは、MC NDが投稿したものです。そうすれば、かっこをエスケープする必要はありません。 – Squashman

答えて

1

を引用:

if /i "%MYMACHINENAME%"=="BuildmasterW64" (
    set PROGRAMFILESDIR=C:\Program Files ^(x86^) 
    set WISEDIR="C:\Program Files ^(x86^)\Wise Installation Studio\WiseScript Package Editor" 
    ) 

ああ、と比較大文字と小文字を区別しないを作るために/Iを追加。

+0

エスケープ文字を指していただきありがとうございます。私は正しいエスケープ文字を知らなかった...この答えを受け入れることは、使いやすいものとして受け入れる。 –

3

代わりの値を引用し、あなたは括弧をエスケープする必要が代入演算

set "MYMACHINENAME=BuildmasterW32" 

if "%MYMACHINENAME%"=="BuildmasterW32" (
    set "PROGRAMFILESDIR=D:\Program Files" 
    set "WISEDIR=D:\Program Files\Wise Installation Studio\WiseScript Package Editor" 
) 

if "%MYMACHINENAME%"=="BuildmasterW64" (
    set "PROGRAMFILESDIR=C:\Program Files (x86)" 
    set "WISEDIR=C:\Program Files (x86)\Wise Installation Studio\WiseScript Package Editor" 
) 

set WISEDIR 
pause 
+0

ありがとうございます。私は完全な行(setコマンドを含む)を引用しようとしましたが、うまくいきませんでした。興味深い事実は、最初の割り当て(PROGRAMFILESDIR)だけを引用すると、構造全体がまったく機能せず、不思議で一見無関係なエラーを生成するということです。だから私は設定するすべての呼び出しを引用する必要があります。 –

+0

@ EugeneMayevski'EldoS、それをしない理由がない限り、常に*割り当て*を引用するのが良い習慣です。問題のある文字の大部分を保護するだけでなく、格納された値の最後にスペースがないことを保証します。あなたのケースでは、引用符で囲む必要がある行(値にかっこが付いている行)が2行あり、1行ではありません。 –

+0

さて、スニペットが機能するための4つのセットコールをすべて引用する必要がありました。必要な引用符を紛失すると奇妙なエラーが発生するので、私は引用の方法がエラーを起こしやすいと考えています。そして、率直に言って、私は30年の練習でセットコールを引用する必要はありませんでした(うまくいけません:)。 –

関連する問題