A Better Project@はてなダイアリー(インポート版)

基本的にここは更新されません。詳細はaboutへ。

WSH の ExpandEnvironmentStrings メソッドを使うときの注意点

はまったのでメモ。
WSHWindows環境変数を展開するためのメソッドに、ExpandEnvironmentStrings メソッドがあります。
このメソッドで得られるのは、環境変数を展開した値の文字列ですが、Windows環境変数には、JScript でのメタ文字である、\(バックスラッシュ)が、パス区切り文字として、含まれていることがあります。
文字列として用いる場合は自動で \ (バックスラッシュ)がエスケープされて問題ないのですが、正規表現として用いる場合は、自動でエスケープされないので、事前にエスケープしておく必要があります。以下、サンプルスクリプト

//正規表現で文字列を検索した結果を返す関数
function TestFunc(testStr1, testStr2){
    var TestRegExp = new RegExp(testStr1);
    var testResult = TestRegExp.test(testStr2);
    return testResult;
}
var WshShell = WScript.CreateObject("WScript.Shell");
//デフォルトならば、%SystemRooT% = C:\WINDOWS,
//%ComSpec% = C:\WINDOWS\system32\cmd.exe
var envSysRoot = WshShell.ExpandEnvironmentStrings("%SystemRooT%");
var envComSpec = WshShell.ExpandEnvironmentStrings("%ComSpec%");
var test1 = TestFunc(envSysRoot, envComSpec);
var escapedEnvSysRoot = envSysRoot.replace(/\\/g, "\\\\");
var test2 = TestFunc(escapedEnvSysRoot, envComSpec);
WScript.Echo(test1 + "," + test2);//=>"false, true"