2009-08-20 23 views
22

Este es un problema desagradable que estoy enfrentando. No se sorprenderá si tiene una solución simple, solo que me elude.

Tengo 2 archivos de proceso por lotes que debo convertir a scripts de PowerShell.

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

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

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

En la línea de comandos, invoco esto como C:> file1.bat uno dos tres La salida que veo es como se esperaba uno dos tres uno dos tres

(Esta es una muestra de código crudo)

Cuando convierto a Powershell, tengo

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] 

Entiendo que esto se debe a que $ args utilizado en file1.ps es un System.Object [] en lugar de 3 cadenas.

Necesito una manera de pasar los $ args recibidos por file1.ps1 a file2.ps1, de la misma manera que se logra con% * en archivos .bat.

Me temo que la forma existente se romperá incluso si se trata de una llamada multifuncional, del mismo modo que es una llamada entre archivos en mi ejemplo.

Han intentado algunas combinaciones, pero nada funciona.

Amablemente ayuda. Lo apreciaría mucho.

Respuesta

8
# use the pipe, Luke! 

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

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

En PowerShell V2, es trivial con splatting. bar sólo se convierte en:

function bar { foo @args } 

Splatting tratará a los miembros de la matriz como argumentos individuales en lugar de pasarlo como un único argumento de matriz.

En PowerShell V1 es complicado, hay una manera de hacerlo para los argumentos posicionales. Dada una función foo:

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

Ahora llamaremos a partir de barras utilizando el método Invoke() en el ScriptBlock de la función foo

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

que se parece a

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

bar args: 1,2,3 

args0 1 args1 2 args2 3 

cuando lo utiliza.

Cuestiones relacionadas