【问题标题】:Sharing variables between jobs在作业之间共享变量
【发布时间】:2014-11-17 11:56:11
【问题描述】:

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

【问题讨论】:

  • 我花了将近 10 个小时寻找方法。但是这些工作是孤立的,因此不知道全局变量或引用变量。除非执行文件,否则在同一 shell 中的函数之间传递的技巧不会在作业之间飞行。它可以是 xml 或 csv 以获得比字符串更多的信息。我想。看stackoverflow.com/questions/8415603/…

标签: powershell pass-by-reference scriptblock


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2015-08-08
    • 1970-01-01
    • 2022-08-06
    • 2022-08-14
    • 1970-01-01
    相关资源
    最近更新 更多