Совместное использование переменных между заданиями

У меня есть сценарий powershell, который должен запускать фоновое задание, пока пользователь не решит, что оно должно закончиться. Фоновым заданием является этот блок сценария:

$block = 
    {
         param(
            [Parameter(Mandatory = $true, Position = 0, valueFromPipeline = $true)]
            $Counters,
            [Parameter(Mandatory = $true, Position = 1, valueFromPipeline = $false)]
            [ref]$killSwitch,
            [Parameter(Mandatory = $false, Position = 2, valueFromPipeline = $false)]
            [long]$SampleInterval = 1000
         )
        [System.Diagnostics.Stopwatch]$sw = New-Object System.Diagnostics.StopWatch
        $sw.Start()
        $last = 0
        $report = New-Object PSObject
        $report | Add-Member -MemberType NoteProperty -Name Start -Value ([DateTime]::Now)
        while(!$killSwitch)
        {
            if($sw.ElapsedMilliseconds -gt $last + $SampleInterval)
            {
                $rec = Get-CounterSample -counters $Counters
                $report | Add-Member -MemberType NoteProperty -Name $sw.ElapsedMilliseconds -Value $rec
                $last = $sw.ElapsedMilliseconds
            }
        }
        $report | Add-Member -MemberType NoteProperty -Name End -Value ([DateTime]::Now)
        return $report  
    }

Как видите, я пытаюсь передать логическое значение ($killSwitch) как способ остановки цикла While после завершения работы пользователя/вызывающего. Я называю это следующим образом:

[bool]$kill = $false
$job = Start-Job -Name twProcMon -ScriptBlock $block -ArgumentList $Counters, ([ref]$kill), $SampleInterval
Read-Host
$kill = $true
Wait-Job $job
Receive-Job $job

Я получаю сообщение об ошибке:

Не удается обработать преобразование аргумента для параметра killSwitch. Тип ссылки ожидается в аргументе.

Как мне передать логическое значение по ссылке на блок кода, чтобы я мог остановить цикл while вне задания? Является ли это возможным?


person Orphid    schedule 17.11.2014    source источник
comment
Я потратил около 10 часов на поиски пути. Но задания изолированы, поэтому не знают о глобальных переменных или переменных, на которые ссылаются. Трюки для передачи между функциями в одной оболочке не летают между заданиями, если только не выполняется файл. Это может быть xml или csv для получения дополнительной информации, чем строка. Я думал. Посмотрите на stackoverflow.com/questions/8415603/   -  person Kirt Carson    schedule 01.09.2019


Ответы (1)


Вы не можете передавать переменные из одного задания в другое. Что вы можете сделать, так это заставить задания создавать определенный файл по завершении и отслеживать существование этого файла во время их выполнения. Сделайте содержимое блока сценария таким, чтобы операция завершалась без создания файла маркера при обнаружении файла.

$block = {
  $marker = 'C:\path\to\marker.txt'
  do while (-not ((Test-Path -LiteralPath $marker) -or ($completionCondition))) {
    # ...
    # do stuff here
    # ...
    if ($completionCondition) { $null > $marker }
  }
}
person Ansgar Wiechers    schedule 17.11.2014