知らぬが仏では済まされない
 スクリプトの作成では,「知らない」ことがそのまま自分の身に跳ね返ってくる。スクリプトがオフラインのコンピュータ,存在しないファイル,あるいはそのほかの実行時エラーに遭遇したときに停止しないようにするため,スクリプト作成者の中には無条件にVBScriptのOn Error Resume Nextステートメントをスクリプトの先頭に記述する人もいる。しかし,米French Mortuaryのシステムとネットワークの管理者であるBill Stewart氏は,このステートメントを常に記述することは益よりも害の方が大きいと主張する。Stewart氏は,「これは実行時エラーを無視するだけでなく,予期しないエラーも無視してしまう。特によく無視されるのが構文エラーと定義されていない変数である」という。

 Stewart氏をはじめ,ほかのスクリプトのエキスパートも,On Error Resume Nextは必要なときだけ慎重に使うことを勧めている。On Error Resume Nextは,実行時エラーが発生しそうなコードの直前に記述する。そして,そのエラーが起きそうなコードの直後にOn Error GoTo 0ステートメントを追加し,再びVBScriptが用意するデフォルトのエラー・ハンドラが有効になるようにする。

リテラルの引用符はエスケープする
 もう一つのよくあるスクリプト・エラーは,引用符(「'」「"」)が文字列の一部であるときに,いつ,どのように引用符を使うかによって発生する。Stewart氏によると,VBScriptのコードの中でコマンド・ライン・ツールを実行しようとした場合が,その典型的な例である。コマンド・ライン・ツールを呼び出す際にパス名を指定しようとすると,問題に突き当たる。例えば,Windows付属の「ペイント」でC:\My Files\org chart.bmpを開くとしよう。コマンド・プロンプトでは以下のように実行する。

mspaint.exe
 "C:\My Files\org chart.bmp"


△ 図をクリックすると拡大されます
図9●単一引用符を含む文字列定数を扱うコードの例

△ 図をクリックすると拡大されます
図10●「C:\My Files\org chart.bmp」というパス名を引用符で囲まずに指定した場合に表示されるエラー
 このコマンドをVBScriptコードの中で実行する場合,図9(A)にあるように「C:\My Files\org chart.bmp」を2重引用符「"」で囲まないと,ファイル名がスペースを含むためにコマンドが失敗し,ペイントから「C:\My.bmpが見つかりません」というエラーが返ってくる(図10)。ところが図9(B)のようにパス名に「"」を加えた場合もコマンドは失敗する。これはスクリプト・エンジンが2つ目の「"」(「C:」の手前にある「"」)を文字列の終点と解釈するからである。ここで表示されるエラーは,「ステートメントの末尾が不正です」である。

 このようなスクリプトの問題を解決するにはいくつかの方法がある。最も簡単で安全な方法は「"」をエスケープする,つまり「"」を特殊文字ではなくリテラル(表記通りの文字)として扱うように指示する特別な文字(エスケープ文字と呼ぶ)を追加することである。VBScriptには汎用のエスケープ文字がないため,図9(C)のように2重引用符をもう1つ使う。2重引用符を使って別の2重引用符をエスケープしている点に戸惑う方もいるだろうが,各2重引用符の中を見れば論理は明白だ。(C)の最初の「"」は分かりやすい。スクリプト・エンジンはこれを文字列の始まりと解釈する。「C:」の手前にある2つの「"」については,最初の「"」が2つ目の「"」をエスケープしているため,これら2つをリテラルの「"」であると解釈する。末尾にある3つの「"」については,最初の「"」が2つ目の「"」をエスケープしているため,2つ目の「"」をリテラルの「"」として解釈する。最後の「"」は文字列の終点として扱う。引用符のエスケープについて詳しくは,Windows Scripting Solutions 2002年12月号に掲載した記事「Rem: Understanding Quotation Marks in VBScript」(InstantDoc ID 26975)を参照していただきたい。

 問題を解決するもう一つの方法は,パス名を囲むために埋め込んだ「"」を表すのにANSIの数値表現を使うことである。ANSIの数値表現では,「"」をChr(34)と表記できる(図9(D))。ただし,2重引用符を単に数値表現で置き換えるだけでは済まない。それに加えて,文字列の連結演算子「&」を使って数値表現とパス名など引用符以外の文字列を連結する必要がある。このように,Chr(34)を使用するのは手間がかかるため,通常はお勧めしない。

 文字列の一部である2重引用符を扱う際の選択肢はほかにもある。例えば,2重引用符で囲んだ文字列を変数に割り当てることである。2重引用符で囲んだ文字列がパス名である場合は,VBScriptファイルを起動するときにコマンド・ラインでパス名を渡すようにするのが一般的である。


△ 図をクリックすると拡大されます
図11●2重引用符で囲んだ文字列中に単一引用符を埋め込んだ例
 2重引用符「"」の代わりに単一引用符「'」を使っているスクリプトを見かけることもある。これはいくつかの理由でお勧めしない。第1に,「'」はVBScriptで有効な文字ではあるものの,コメント文字,つまりその行の残りの文字がコメントであってコードではないことを示す文字でもあるからだ。「'」が「"」で囲んだ文字列内に埋め込まれていない場合,スクリプト・エンジンは最初の「'」に続くコードをコメントと解釈してしまう。第2に,WQL(WMI Query Language)では「'」が予約文字(詳細は後述)であるために,問題を引き起こす可能性がある。最後に,メッセージを表示する際には「"」の代わりに「'」を使えるものの,この代替策がすべての場合に有効とは限らないことだ。例えば図11のコードは問題なく実行できるが,図9(C)のコードで「'」を使おうとすると無効なパスがあるというエラー・メッセージが表示される。

 引用符に関する最後のアドバイスは,「スクリプトはテキスト・エディタで書く」である。Christa Anderson氏は,「Quick Scripting Tips」で以下のように述べている——「ワープロ・ソフトでスクリプトを書いて,それをテキスト・エディタにコピーして保存してはいけない。スクリプトは引用符を多用する。ワープロ・ソフトがストレート・クオート(「'」)をスマート・クォート(「‘」と「’」)に変換してしまったら,テキスト・エディタにスクリプトをコピーしたときに引用符が不正な文字になり,スクリプトは動作しない」——。