what started start scripts open how getting activar powershell scriptblock

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

Ver también here y here .