web-dev-qa-db-ja.com

コマンドライン$ argsをpowershellで関数から関数に渡す

これは私が直面している厄介な問題です。簡単な解決策があっても驚かないでください。

Powershellスクリプトに変換する必要がある2つのバッチファイルがあります。

file1.bat
---------

echo %1
echo %2
echo %3
file2.bat %*

file2.bat
--------
echo %1
echo %2
echo %3

コマンドラインで、これをC:> file1.bat one two threeとして呼び出します。出力は予想通りです。12 3 1 2 3

(これは大まかなコードサンプルです)

Powershellに変換すると、

file1.ps1
---------
Write-Host "args[0] " $args[0]
Write-Host "args[1] " $args[1]
Write-Host "args[2] " $args[2]
. ./file2.ps1 $args

file2.ps1
---------
Write-Host "args[0] " $args[0]
Write-Host "args[1] " $args[1]
Write-Host "args[2] " $args[2]

When I invoke this on powershell command line, I get
$> & file1.ps1 one two three
args[0] one
args[1] two
args[2] three
args[0] one two three 
args[1] 
args[2] 

これは、file1.psで使用される$ argsが3つの文字列ではなくSystem.Object []であるためと理解しています。

File1.ps1が受け取った$ argsをfile2.ps1に渡す方法が必要です。これは、.batファイルの%*によって達成される方法と同じです。

残念ながら、既存の方法は、たとえ関数間呼び出しであっても、私の例ではファイル間呼び出しと同じように壊れます。

いくつかの組み合わせを試しましたが、何も機能しません。

親切に助けてください。よろしくお願いします。

25
Bhavesh Kotak

PowerShell V2では、スプラッティングは簡単です。バーは次のようになります:

_function bar { foo @args }
_

スプラッティングは、配列メンバーを単一の配列引数として渡すのではなく、個別の引数として扱います。

PowerShell V1は複雑ですが、位置引数に対してそれを行う方法があります。関数fooが与えられた場合:

_function foo { write-Host args0 $args[0] args1 $args[1] args2 $args[2]   }
_

次に、foo関数のスクリプトブロックでInvoke()メソッドを使用して、barから呼び出します

_function bar { $OFS=',';  "bar args: $args";  $function:foo.Invoke($args) }
_

どっち?

 PS(STA)(16)> bar 1 2 3 
 
 bar args:1,2,3 
 
 args0 1 args1 2 args2 3 

あなたがそれを使うとき。

37
Bruce Payette
# use the pipe, Luke!

file1.ps1
---------
$args | write-Host
$args | .\file2.ps1    

file2.ps1
---------
process { write-Host $_ }
9
Richard Berg