PowerShellの.PS1ファイルをバッチファイル化する。(その3)
スクリプトを標準入力から渡すと、うまく行かないことがあるので、代わりに、スクリプトをファイルから読んで実行します。
.PS1ファイルの先頭に6行を加えて、拡張子を.CMDに変えます。
※ 末尾の空行追加は不要です。
@ECHO OFF
SETLOCAL
(SET args=%*)
(SET arg0=%~f0)
powershell.exe -command "& {$s=get-content $env:arg0;$s=$s[([Array]::LastIndexOf($s,'GOTO:EOF')+1)..($s.length-1)];$s='function getargs{$xargs=$args}. getargs '+$env:args+';'+[String]::Join([char]13+[char]10,$s);invoke-expression $s;}"
GOTO:EOF
$xargs.gettype()
$xargs.length
foreach($arg in $xargs){$arg}
引数は、環境変数args経由、$xargsに取り出しています。
元のスクリプトは、$xargsを参照するように変えます。
或いは、.PS1ファイルの先頭に6行を加えて、拡張子を.CMDに変えます。
@ECHO OFF
SETLOCAL
(SET args=%*)
(SET arg0=%~f0)
powershell.exe -command "& {$s=get-content $env:arg0;$s=$s[([Array]::LastIndexOf($s,'GOTO:EOF')+1)..($s.length-1)]+\'\';$s='function main {'+[String]::Join([char]13+[char]10,$s)+'}main '+$env:args;invoke-expression $s;}"
GOTO:EOF
$args.gettype()
$args.length
foreach($arg in $args){$arg}
これは、元のスクリプトを関数に括って呼び出すので、引数を$argsのまま参照できます。
« PowerShellでソースファイルをインクルードする。 | トップページ | PowerShellの.PS1ファイルをバッチファイル化する。(その4) »