WiX 3.9 をインストールして、動作テストのために Visual Studio からいつものバッチファイルを起動してみると、「指定されたパスが見つかりません。ビルド中にエラーが発生しました。」と表示されてしまいました。 😥
この原因調査と対策を行ったので記録しておきます。
使っているインストーラー作成のバッチファイルは、CodeZine に掲載された記事を基にしたものです。
エラーが発生した原因は WiX Toolset のインストール先を記録している環境変数 WIXDIR が無かったことです。WiX 3.9 では、環境変数 WIX に記録されていました(パソコンの環境を作りなおしているので、WIXDIR から WIX に変更になって削除されたのか、もともと WIX に記録されていたのかは不明。。。)。
そこで、環境変数 WIX を参照するように変更したのですが、今度はインストールパスに空白が含まれるにも関わらず、ダブルコーテーションで括られていないためにバッチファイルの実行途中でエラーが発生 😥
# まったく。。。フォルダ名に空白文字を許すようなことをしたのが延々と祟ってる 😡
環境変数 WIX の内容: C:\Program Files (x86)\WiX Toolset v3.9\
こうなっていれば、エラーにならない: “C:\Program Files (x86)\WiX Toolset v3.9”
mori3p さんのご指摘を受けて、コマンド実行時にダブルコーテーションで括るように変更しました。
対策後のバッチファイル(該当部分のみ)
REM コンパイル
ECHO "環境変数 WIX:" %WIX%
ECHO "コンパイル"
"%WIX%BIN\CANDLE.EXE" %FNAME%.wxs -out obj\ -ext WiXUtilExtension
ECHO "コンパイル終了"
IF ERRORLEVEL 1 GOTO BLD_ERR
REM リンク
ECHO "リンク"
"%WIX%BIN\LIGHT.EXE" obj\%FNAME%.wixobj -out bin\%FNAME%.msi -ext WiXUIExtension -ext WixNetFxExtension -ext WiXUtilExtension -cultures:ja-jp
IF ERRORLEVEL 1 GOTO BLD_ERR
はじめまして、MVVMネタの記事を読ませていただいて、たまたま、この記事を見かけたのでコメントさせていただきます。
>環境変数 WIX の内容: C:\Program Files (x86)\WiX Toolset v3.9\
>こうなっていれば、エラーにならない: “C:\Program Files (x86)\WiX Toolset v3.9″
私はこれで痛い目にあった経験があります。それで調べたのですが、
*環境変数にパスを格納するときは、ダブルクォーテーションを付けないのが一般的です。(setコマンドを実行してみると分かりますが、wixも含めて、まともなツールなら、環境変数のパスを括っているのは皆無だと思います)
*勘違いしている人が意外に多いですが、そもそも、環境変数にパスを書くときにダブルクォーテーションは必須ではない。
*バッチコマンドでは、パスに空白文字が含まれているときに、ダブルクォーテーションで括ることは必須だが、途中にダブルクォーテーションが含まれているときの挙動は、そのパスを処理する処理系(コマンド)に依存する。
具体的には、
(1) “C:\Program Files (x86)\WiX Toolset v3.9\bin\candle.exe”
は一意にしか解釈されないですが、
(2) “”C:\Program Files (x86)\WiX Toolset v3.9\”bin\candle.exe”
(3) “C:\Program Files (x86)\WiX Toolset v3.9\”bin\candle.exe
などは、処理系によって解釈が異なる場合がある。
たとえば、(2)/(3)を受け付ける標準コマンドは多いですが、(2)を、
“”
C:\Program
Files
(x86)\WiX
Toolset
v3.9\
“bin\candle.exe”
と解釈する標準コマンドが実際に存在します。
途中で気づいて、
set WIX=“C:\Program Files (x86)\WiX Toolset v3.9\bin\″
から、
set WIX=C:\Program Files (x86)\WiX Toolset v3.9\bin\
に変更すると、
(2) “%WIX%bin\candle.exe”
のパターンは問題ありませんが、
(3) %WIX%bin\candle.exe
のパターンはアウトになって、すべて修正する羽目になる。
そのため、環境変数にパスを格納するときは、ダブルクォーテーションで括らず、使用するときにパス全体をダブルクォーテーションで括る作法にするのが一般的だということです。
ご指摘ありがとうございます。
たしかにパス中のダブルコーテーションの評価はコマンドの実装に依存するわけで、これを書いた時にもちょっと気にはなっていましたが、スクリプト中の一時的な環境変数設定なので流してしまっていた部分です 🙁
ご指摘を受けて、コマンド実行時にダブルコーテーションで括るように変更しました。
作法として統一的な手法を使うようにすれば、不要な間違いを誘発する可能性が減るので望ましいですね 🙂