« PowerShellの.PS1ファイルをバッチファイル化する。(その3) | トップページ | Webページ上でバッチファイルの行末に余計な空白が付くのを防止する。 »

2007年8月22日 (水)

PowerShellの.PS1ファイルをバッチファイル化する。(その4)

更に、標準入力が使えるようにします。

.PS1ファイルの先頭に6行を加えて、拡張子を.CMDに変えます。

@ECHO OFF
SETLOCAL
(SET args=%*)
(SET arg0=%~f0)
powershell.exe -command "$stdin=@()+$input;if($stdin.length){$stdin=[String]::Join([Char]13+[Char]10,$stdin)}else{$stdin=[System.Console]::In.ReadToEnd()}$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
  $xargs
  $stdin

引数は、環境変数args経由、$xargsに取り出しています。
元のスクリプトは、$xargsを参照するように変えます。
標準入力は$stdinで参照するように変えます。

或いは、.PS1ファイルの先頭に6行を加えて、拡張子を.CMDに変えます。

@ECHO OFF
SETLOCAL
(SET args=%*)
(SET arg0=%~f0)
powershell.exe -command "$stdin=@()+$input;if($stdin.length){$stdin=[String]::Join([Char]13+[Char]10,$stdin)}else{$stdin=[System.Console]::In.ReadToEnd()}$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)+'}$stdin|main '+$env:args;invoke-expression $s;"
GOTO:EOF
  $args.gettype()
  $args.length
  $args
  $input

これは、元のスクリプトを関数に括って呼び出すので、引数を$argsのまま参照できます。
標準入力は$inputのまま参照できます。

« PowerShellの.PS1ファイルをバッチファイル化する。(その3) | トップページ | Webページ上でバッチファイルの行末に余計な空白が付くのを防止する。 »