« CreateFolder() フォルダを再帰的に作成する関数 | トップページ | コマンドラインでショートカットを作成、変更、表示するバッチファイル »

2008年11月25日 (火)

WSHの引数で二重引用符 " をエスケープするには?(その2)

一般的なコンベンションでは、引数に"を渡すときは、引数を"で囲み、引数の中の"を""に変えて書きます。
"引""数"
アプリ側には、引数を囲む"は渡らず、引数の中の""が"に戻されて渡ります。
引"数

しかし、WSHでは、引数の"がすべて消えてしまいます。

そこで、もし、WSHで引数に"を渡したいときは、`で代用し、スクリプト側で戻します。
"引`数" → 引`数 → 引"数

ここで、もし、WSH(JScript)をバッチファイルでラップすると、一般的なコンベンションが使えます。
"引""数" → "引`数" → 引`数 → 引"数

@if(0)==(0) ECHO OFF
SETLOCAL
SET ARGS=
FOR %%1 IN (%*) DO (
SET "ARG=%%~1"
IF DEFINED ARG CALL SET "ARG=%%ARG:""=`%%"
CALL SET ARGS=%%ARGS%% "%%ARG%%"
)
CScript.exe //NoLogo //E:JScript "%~f0" %ARGS%
GOTO :EOF
@end
for(var k=0;k<WScript.Arguments.Count();k++){
  WScript.Echo(WScript.Arguments.Item(k).replace(/`/g,'"'));
}

VBScriptの場合は、別ファイルにします。

hoge.cmd
---
@ECHO OFF
SETLOCAL
SET ARGS=
FOR %%1 IN (%*) DO (
SET "ARG=%%~1"
IF DEFINED ARG CALL SET "ARG=%%ARG:""=`%%"
CALL SET ARGS=%%ARGS%% "%%ARG%%"
)
CScript.exe //NoLogo ".\hoge.vbs" %ARGS%
---

hoge.vbs
---
For Each Arg In WScript.Arguments
  WScript.Echo Replace(Arg,"`","""")
Next
---

« CreateFolder() フォルダを再帰的に作成する関数 | トップページ | コマンドラインでショートカットを作成、変更、表示するバッチファイル »