我有一个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循环?有可能吗?
答案 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 }
}
}