command line - Pasando alrededor de la línea de comando $ args en powershell, de una función a otra
command-line nested (2)
En PowerShell V2 , es trivial con salpicaduras. bar se convierte en:
function bar { foo @args }
Splatting tratará a los miembros de la matriz como argumentos individuales en lugar de pasarlos 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 llámelo desde la barra usando el método Invoke()
en el bloque de script de la función foo
function bar { $OFS='',''; "bar args: $args"; $function:foo.Invoke($args) }
Que parece
PS (STA) (16) > bar 1 2 3 bar args: 1,2,3 args0 1 args1 2 args2 3
cuando lo usas
Este es un problema desagradable que estoy enfrentando. No se sorprenda si tiene una solución simple, solo que me está escapando.
Tengo 2 archivos por lotes que tengo que 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 la esperada uno dos tres uno dos tres
(Este es un ejemplo de código crudo)
Cuando me 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 objeto System.Object [] en lugar de 3 cadenas.
Necesito una forma de pasar los $ args recibidos por file1.ps1 a file2.ps1, de la misma manera que se logra con% * en los archivos .bat.
Me temo que la manera existente se romperá incluso si es una llamada de funciones cruzadas, de la misma manera que es una llamada de archivos cruzados en mi ejemplo.
He probado algunas combinaciones, pero nada funciona.
Por favor ayuda Se lo agradeceria mucho
# use the pipe, Luke!
file1.ps1
---------
$args | write-host
$args | ./file2.ps1
file2.ps1
---------
process { write-host $_ }