PowerShell-Как предварительно оценить переменные в сценарии сценария для начала Job

StackOverflow https://stackoverflow.com/questions/19834643

Вопрос

Я хочу использовать фоновые задания в PowerShell.

Как сделать переменные, оцениваемые в момент определения сценария?

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

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

$job = Start-Job -ScriptBlock $sb

$job | Wait-Job | Receive-Job

$job | Remove-Job

Я печатаю пустые значения $ V1 и $ V2. Как я могу оценить их в (перенесено) сценарию и так на фоновой работе?

Это было полезно?

Решение

Одним из способов является использование метода [ScriptBlock] :: Создание блока сценария из разгоночной строки с использованием локальных переменных:

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

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

$job = Start-Job -ScriptBlock $sb

Другой метод - установить переменные в инициализации:

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

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

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

Третий вариант -использовать параметр -ArgumentList:

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

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

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

Другие советы

Самое простое решение (которое требует V3 или более), выглядит следующим образом:

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

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

$job = Start-Job -ScriptBlock $sb

Вы можете придумать, что $ использует как работает примерно как явный блок Param () и прохождение -аргумент, только PowerShell обрабатывает это для вас автоматически.

Объявите значения как параметры в блоке сценария, затем передайте их с помощью -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

Я не на компьютере, чтобы проверить, но это должно работать:

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

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

Я дважды проверю это, когда я приду к работе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top