2022年5月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
無料ブログはココログ

« PowerShellでソースファイルをインクルードする。 | トップページ | PowerShellの.PS1ファイルをバッチファイル化する。(その4) »

2007年8月21日 (火)

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) »