これは私が直面している厄介な問題です。簡単な解決策があっても驚かないでください。
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ファイルの%*によって達成される方法と同じです。
残念ながら、既存の方法は、たとえ関数間呼び出しであっても、私の例ではファイル間呼び出しと同じように壊れます。
いくつかの組み合わせを試しましたが、何も機能しません。
親切に助けてください。よろしくお願いします。
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
あなたがそれを使うとき。
# use the pipe, Luke!
file1.ps1
---------
$args | write-Host
$args | .\file2.ps1
file2.ps1
---------
process { write-Host $_ }