started - powershell scripts
Pasar argumentos a un scriptblock en powershell (5)
Por cierto, si usa el bloque de scripts para ejecutar en un hilo separado (multi-hilo):
$ScriptBlock = {
param($AAA,$BBB)
return "AAA is $($AAA) and BBB is $($BBB)"
}
$AAA = "AAA"
$BBB = "BBB1234"
$null = Start-Job $ScriptBlock -ArgumentList $AAA,$BBB
luego cede:
$null = Start-Job $ScriptBlock -ArgumentList $AAA,$BBB
Get-Job | Receive-Job
AAA is AAA and BBB is BBB1234
Supongo que no puedes simplemente hacer esto:
$servicePath = $args[0]
if(Test-Path -path $servicePath) <-- does not throw in here
$block = {
write-host $servicePath -foreground "magenta"
if((Test-Path -path $servicePath)) { <-- throws here.
dowork
}
}
Entonces, ¿cómo puedo pasar mis variables al scriptblock $ block?
Por defecto, PowerShell no capturará variables para un ScriptBlock. Sin embargo, puede capturarlo explícitamente llamando a GetNewClosure()
sobre él:
$servicePath = $args[0]
if(Test-Path -path $servicePath) <-- does not throw in here
$block = {
write-host $servicePath -foreground "magenta"
if((Test-Path -path $servicePath)) { <-- no longer throws here.
dowork
}
}.GetNewClosure() <-- this makes it work
Sé que este artículo está un poco anticuado, pero quería descartarlo como una posible alternativa. Solo una ligera variación de las respuestas anteriores.
$foo = {
param($arg)
Write-Host "Hello $arg from Foo ScriptBlock" -ForegroundColor Yellow
}
$foo2 = {
param($arg)
Write-Host "Hello $arg from Foo2 ScriptBlock" -ForegroundColor Red
}
function Run-Foo([ScriptBlock] $cb, $fooArg){
#fake getting the args to pass into callback... or it could be passed in...
if(-not $fooArg) {
$fooArg = "World"
}
#invoke the callback function
$cb.Invoke($fooArg);
#rest of function code....
}
Clear-Host
Run-Foo -cb $foo
Run-Foo -cb $foo
Run-Foo -cb $foo2
Run-Foo -cb $foo2 -fooArg "Tim"
Un scriptblock es solo una función anónima. Puede usar $args
dentro del scriptblock y declarar un bloque param, por ejemplo
$sb = {
param($p1, $p2)
$OFS = '',''
"p1 is $p1, p2 is $p2, rest of args: $args"
}
& $sb 1 2 3 4
& $sb -p2 2 -p1 1 3 4
La respuesta de Keith también funciona para Invoke-Command
, con el límite de que no puede usar parámetros con nombre. Los argumentos se deben establecer con el parámetro -ArgumentList
y se deben separar por comas.
$sb = {param($p1,$p2) $OFS='',''; "p1 is $p1, p2 is $p2, rest of args: $args"}
Invoke-Command $sb -ArgumentList 1,2,3,4