2009-08-20 5 views
22

Dies ist ein unangenehmes Problem, mit dem ich konfrontiert bin. Wundern Sie sich nicht, wenn es eine einfache Lösung hat, nur dass es mir entgeht.

Ich habe 2 Batch-Dateien, die ich in Powershell-Skripts konvertieren muss.

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

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

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

auf der Kommandozeile, rufe ich dies als C:> file1.bat eins zwei drei Der Ausgang I zu sehen ist, wie ein zwei drei erwarteten ein zwei drei

(Dies ist ein grobes Codebeispiel)

Als ich in Powershell konvertieren, ich habe

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] 

Ich verstehe, dass $ args in file1.ps ein System.Object [] anstelle von 3 Strings verwendet wird.

Ich brauche eine Möglichkeit, die $ args, die von file1.ps1 empfangen werden, an file2.ps1 zu übergeben, ähnlich wie bei% * in .bat-Dateien.

Ich fürchte, die bestehende Art und Weise wird auch dann brechen, wenn es ein funktionsübergreifender Aufruf ist, so wie es in meinem Beispiel eine Cross-Datei-Aufruf ist.

Habe ein paar Kombinationen ausprobiert, aber nichts funktioniert.

Bitte helfen. Würde es sehr schätzen.

Antwort

8
# use the pipe, Luke! 

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

file2.ps1 
--------- 
process { write-host $_ } 
31

In Powershell V2, dann ist es mit splatting trivial. Bar wird gerade:

function bar { foo @args } 

Splatting behandelt die Array-Mitglieder als einzelne Argumente, anstatt es als einzelnes Array-Argument übergeben.

In PowerShell V1 ist es kompliziert, es gibt eine Möglichkeit, es für Positionsargumente zu tun. Bei einer Funktion foo:

function foo { write-host args0 $args[0] args1 $args[1] args2 $args[2] } 

Nun rufen sie von der Bar mit der Invoke() Methode auf der Skript der foo Funktion

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

Welche sieht aus wie

 
PS (STA) (16) > bar 1 2 3 

bar args: 1,2,3 

args0 1 args1 2 args2 3 

, wenn Sie es verwenden.

Verwandte Themen