2014-11-17 3 views
0

У меня есть сценарий 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 

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

Cannot process argument transformation on parameter 'killSwitch'. Reference type is expected in argument.

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

ответ

1

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

$block = { 
    $marker = 'C:\path\to\marker.txt' 
    do while (-not ((Test-Path -LiteralPath $marker) -or ($completionCondition))) { 
    # ... 
    # do stuff here 
    # ... 
    if ($completionCondition) { $null > $marker } 
    } 
} 
Смежные вопросы