在作业之间共享变量

时间:2014-11-17 11:56:12

标签: powershell pass-by-reference scriptblock

我有一个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'的参数转换。   参数类型在参数中是预期的。

如何通过引用代码块来传递bool,这样我就可以从作业外部杀死while循环?有可能吗?

1 个答案:

答案 0 :(得分:2)

您无法将变量从一个作业传递到另一个作业。您可以做的是让作业在完成时创建特定文件,并在它们运行时监视该文件是否存在。制作脚本块的内容,以便在发现文件时终止操作而不创建标记文件。

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