我有一个调用Write-Progress
的PowerShell函数。
在另一个函数中,我想获得显示进度的状态。
是否可以查询显示进度的状态?
用例是这样的:
Write-Progress
来更新-PercentComplete
。-PercentComplete
进度,但我不知道当前完成的百分比是多少。我也不想传递一个" Progress"如果我可以查询显示的进度对象,则对象为B. 我已将其标记为powershell-v2.0,因为这就是我的环境。
我试过查看$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
}
}
答案 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