2014年3月16日日曜日

VBScript でパスに空白を含むアプリケーションを起動するときには、二重引用符を 2 つ続ける

1. パスに空白を含むアプリケーションを起動するスクリプト

SnapCrab_No-0888 VBScript で Program Files フォルダの中にあるアプリケーションを起動したい。

例えば、LibreOffice を立ち上げるために test01.vbs ファイルに以下のように記述した。

CreateObject("WScript.Shell").Run "C:\Program Files (x86)\LibreOffice 4\program\soffice.exe"

実行すると、「ファイルが見つからない」旨のエラーが表示される。

---------------------------
Windows Script Host
---------------------------
スクリプト:    C:\test01.vbs
行:    1
文字:    1
エラー:    指定されたファイルが見つかりません。
コード:    80070002
ソース:     (null)

 

2. 文字列型のリテラルで二重引用符を用いる場合、二重引用符を 2 つ続ける

理由は、アプリケーションのパスに空白を含むときは、引用符を付ける必要があるため。

上記のコードでは、アプリケーションのパスを二重引用符で囲んでいる。しかし、これは文字列リテラルを表すためのもの。

Visual Basic における文字列の基本 によると、

文字列型 (String) の変数にリテラルを代入する場合は、二重引用符 ("") で囲む必要があります。 このため、文字列内の二重引用符は、二重引用符で表現できません。

… Visual Basic は二重引用符が文字列リテラルに 2 つ続けて出現した場合に、文字列内の 1 つの二重引用符として解釈します。

よって、次のように修正する。

CreateObject("WScript.Shell").Run """C:\Program Files (x86)\LibreOffice 4\program\soffice.exe"""

メッセージボックスに文字列を与えたときの動作を確認すると理解しやすい。

MsgBox "C:\Program Files (x86)\LibreOffice 4\program\soffice.exe"
MsgBox """C:\Program Files (x86)\LibreOffice 4\program\soffice.exe"""

実行すると、ダイアログに以下のように表示される。

C:\Program Files (x86)\LibreOffice 4\program\soffice.exe
"C:\Program Files (x86)\LibreOffice 4\program\soffice.exe"

前者は引用符で囲まれておらず、後者は引用符で囲まれている。

 

参考サイト