如何获取Write-Progress产生的进度信息?

时间:2015-08-19 16:04:58

标签: powershell powershell-v2.0

我有一个调用Write-Progress的PowerShell函数。 在另一个函数中,我想获得显示进度的状态。 是否可以查询显示进度的状态?

用例是这样的:

  • 我有功能A,它将功能B调用10次。
  • 每次功能A调用功能B时,都会调用Write-Progress来更新-PercentComplete
  • 在功能B中,我想更新-PercentComplete进度,但我不知道当前完成的百分比是多少。我也不想传递一个" Progress"如果我可以查询显示的进度对象,则对象为B.

我已将其标记为,因为这就是我的环境。

我试过查看$host变量,以及$host.UI$host.UI.RawUI,但找不到我想要的内容。

所以对于其他感兴趣的人,我最终在一个模块中定义了这两个函数(为HAL9256的灵感获得了荣誉):

function Get-Progress {
    [cmdletbinding()]
    param()

    if (-not $global:Progress) {
        $global:Progress = New-Object PSObject -Property @{
            'Activity' = $null
            'Status' = $null
            'Id' = $null
            'Completed' = $null
            'CurrentOperation' = $null
            'ParentID' = $null
            'PercentComplete' = $null
            'SecondsRemaining' = $null
            'SourceId' = $null
        }
    }

    $global:Progress
}




function Show-Progress {
    [cmdletbinding()]
    param()

    $progress = $global:Progress

    $properties = $progress.PSObject.Properties | Where {$_.MemberType -eq 'NoteProperty'}

    $parameters = @{}
    foreach ($property in $properties) {
        if ($property.Value) {
            $parameters[$property.Name] = $property.Value
        }
    }

    if ($parameters.Count) {
        Write-Progress @parameters
    }
}

2 个答案:

答案 0 :(得分:1)

无需查询。您必须自己跟踪/计算百分比并将其传递给cmdlet,否则Write-Progress将无法知道要显示的内容。

为函数B添加一个附加参数,并为函数A添加一个计数器:

function A {
  $i = 1
  1..10 | % {
    B (10 * $i)
    $i++
  }
}

function B($p) {
  Write-Progress -Activity 'foo' -PercentComplete $p
}

答案 1 :(得分:1)

我遇到过类似的问题,我有一个运行脚本操作的模块和一个必须记录进度的单独的Logging模块。最简单的,从所有可能的方法是最可靠的方法(我知道人们会不寒而栗)是使用全局变量。

如果你不想要来回传递一堆额外的参数,这是最好的方法。

#Set global variable
$global:Progress = 10

#------ Other function -----------

#Write Progress
Write-Progress -Activity 'foo' -PercentComplete $global:Progress