1

ユーザーが終了する必要があると判断するまで、バックグラウンド ジョブを実行するはずの 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 ループを強制終了できるように、コード ブロックへの参照によって bool を渡すにはどうすればよいですか? 出来ますか?

4

1 に答える 1

2

あるジョブから別のジョブに変数を渡すことはできません。できることは、ジョブが完了時に特定のファイルを作成し、実行中にそのファイルの存在を監視することです。ファイルが検出されたときにマーカー ファイルを作成せずに操作が終了するように、スクリプト ブロックの内容を作成します。

$block = {
  $marker = 'C:\path\to\marker.txt'
  do while (-not ((Test-Path -LiteralPath $marker) -or ($completionCondition))) {
    # ...
    # do stuff here
    # ...
    if ($completionCondition) { $null > $marker }
  }
}
于 2014-11-17T12:08:49.973 に答える