2009-08-20 5 views
22

Questo è un brutto problema che sto affrontando. Non sarei sorpreso se ha una soluzione semplice, solo che mi sfugge.

Ho 2 file batch che devo convertire in script PowerShell.

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

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

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

Nella riga di comando, invoco questo come C:> file1.bat uno due tre L'uscita vedo è come previsto uno due tre uno due tre

(Questo è un esempio di codice grezzo)

Quando mi converto al Powershell, ho

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] 

Capisco questo perché $ args utilizzati in file1.ps è un System.Object [] invece di 3 stringhe.

Ho bisogno di un modo per passare i $ arg ricevuti da file1.ps1 a file2.ps1, più o meno allo stesso modo ottenuto da% * nei file .bat.

Ho paura, il modo esistente si interromperà anche se è una chiamata cross-function, proprio come nel mio esempio è una chiamata cross-file.

Ho provato alcune combinazioni, ma niente funziona.

Gentile aiuto. Lo apprezzerebbe molto.

risposta

8
# use the pipe, Luke! 

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

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

In PowerShell V2, è banale con splatting. bar diventa solo:

function bar { foo @args } 

Splatting tratterà i membri di matrice come singoli argomenti invece di passare come un unico argomento di matrice.

In PowerShell V1 è complicato, c'è un modo per farlo per argomenti posizionali. Data una funzione foo:

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

Ora chiamare dal bar con il metodo Invoke() sul scriptblock della funzione foo

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

che assomiglia

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

bar args: 1,2,3 

args0 1 args1 2 args2 3 

quando lo si utilizza.