Pergunta

Eu quero usar os trabalhos em segundo plano em Powershell.

Como tornar as variáveis avaliadas no momento da ScriptBlock definição?

$v1 = "123"
$v2 = "asdf"

$sb = {
    Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -ScriptBlock $sb

$job | Wait-Job | Receive-Job

$job | Remove-Job

Eu impresso vazio valores de us $v1 $v2.Como posso tê-los avaliada em (passado) o scriptblock e, assim, o trabalho em segundo plano?

Foi útil?

Solução

Uma maneira é usar o [scriptblock]::método create para criar o bloco de script a partir de um expanadable cadeia de caracteres usando variáveis locais:

$v1 = "123"
$v2 = "asdf"

$sb = [scriptblock]::Create("Write-Host 'Values are: $v1, $v2'")

$job = Start-Job -ScriptBlock $sb

Outro método é definir variáveis no InitializationScript:

$Init_Script = {
$v1 = "123"
$v2 = "asdf"
}

$sb = {
    Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -InitializationScript $Init_Script -ScriptBlock $sb 

Uma terceira opção é usar o parâmetro-Argumentlist:

$v1 = "123"
$v2 = "asdf"

$sb = {
    Write-Host "Values are: $($args[0]), $($args[1])"
}

$job = Start-Job  -ScriptBlock $sb -ArgumentList $v1,$v2

Outras dicas

A solução mais simples (que requer V3 ou superior) se parece com isso:

$v1 = "123"
$v2 = "asdf"

$sb = {
     Write-Host "Values are: $using:v1, $using:v2"
}

$job = Start-Job -ScriptBlock $sb

Você pode pensar $usando de trabalho, de aproximadamente como uma explícita param() bloco e passando -ArgumentList, apenas PowerShell alças para você automaticamente.

Declarar os valores como parâmetros no bloco de script e, em seguida, passe-os na utilização de -ArgumentList

$v1 = "123"
$v2 = "asdf"

$sb = {
    param
    (
        $v1,
        $v2
    )
    Write-Host "Values are: $v1, $v2"
}

$job = Start-Job -ScriptBlock $sb -ArgumentList $v1, $v2

$job | Wait-Job | Receive-Job

$job | Remove-Job

Eu não sou um computador para validar, mas isso deve funcionar:

$sb = {
    param($p1,$p2)
    Write-Host "Values are: $p1, $p2"
}

$job = Start-Job -ScriptBlock $sb -ArgumentList $v1,$v2

Vou verificar isso duplo quando eu chegar no trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top