Как передать переменную по ссылке на задание или пространство выполнения Powershell? - PullRequest
0 голосов
/ 08 января 2019

У меня есть работа в Powershell.

$cmd = {
  param($a, $b)
  $a++
  $b++
}

$a = 1
$b = 2

Start-Job -ScriptBlock $cmd -ArgumentList $a, $b

Как передать $a и $b по ссылке, чтобы после выполнения задания они были обновлены? В качестве альтернативы, как передать переменные по ссылке на пространства выполнения?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Передача параметров по ссылке всегда неудобна в PowerShell и, вероятно, в любом случае не будет работать для заданий PowerShell, как отмечал @ bluuf .

Я бы, наверное, сделал что-то вроде этого:

$cmd = {
    Param($x, $y)
    $x+1
    $y+1
}

$a = 1
$b = 2

$a, $b = Start-Job -ScriptBlock $cmd -ArgumentList $a, $b |
         Wait-Job |
         Receive-Job

Приведенный выше код передает переменные $a и $b в блок сценариев и присваивает измененные значения переменным после получения выходных данных задания.

0 голосов
/ 08 января 2019

Простой пример, который я только что написал (не обращайте внимания на грязный код)

# Test scriptblock
$Scriptblock = {
param([ref]$a,[ref]$b)
$a.Value = $a.Value + 1
$b.Value = $b.Value + 1
}

$testValue1 = 20 # set initial value
$testValue2 = 30 # set initial value

# Create the runspace
$Runspace = [runspacefactory]::CreateRunspace()
$Runspace.ApartmentState = [System.Threading.ApartmentState]::STA
$Runspace.Open()
# create the PS session and assign the runspace
$PS = [powershell]::Create()
$PS.Runspace = $Runspace

# add the scriptblock and add the argument as reference variables
$PS.AddScript($Scriptblock)
$PS.AddArgument([ref]$testValue1)
$PS.AddArgument([ref]$testValue2)

# Invoke the scriptblock
$PS.BeginInvoke()

После выполнения этого значения тестовых значений обновляются, поскольку они передаются по ссылке.

...