【发布时间】:2021-08-04 07:33:15
【问题描述】:
编辑:添加说明我的愿望只是显示一个带有 已知 结束(例如管道结束)的进度条,以便该函数可以提供完成百分比(通常用于大型集成百上千)。我偶尔会编写函数来从管道或通过参数获取对象,以便函数灵活。
从参数传入的对象数组的进度条很简单,相当于先拉入完整的管道集,然后再处理它们。我一直在避免后者,我只是放弃了这种情况下的写入进度,因为它不值得影响。
我不记得我在哪里看到的,但有人提到 $PSCmdlet.MyInvocation 可能会提供计数,但也许我解释错了。
我编写了一些接受管道输入的函数,并且经常想为通过管道进入函数的所有对象编写一个百分比进度条。
有没有办法在函数的开头获取总数?
我知道当函数在管道对象中循环时如何增加计数器,但这只会让我知道到目前为止处理的对象数量。我想通过根据完整的管道计数来计算它的百分比。
我查看了 $MyInvocation 和 $PSCmdlet.MyInvocation 属性,但无论管道集有多大,PipelineLength 和 PipelinePosition 值区域始终为“2”是。
注意:这不是我所关注的解决方案,它只是我发现看起来很有希望的事情之一
这是一个测试:
Function Test-Pipeline {
[CmdletBinding()]
PARAM(
[Parameter(ValueFromPipeLine=$true,ValueFromPipelineByPropertyName=$true)]
[Alias("FullName")]
[psobject[]]$Path
)
BEGIN{
$PSCmdlet.MyInvocation | Select *
}
PROCESS{
ForEach ($xpath in $Path) {
$filepath = Resolve-Path $xpath | Select -ExpandProperty Path
}
}
END{}
}
当我输入 dir 的内容(该文件夹包含 20 个项目)时,我得到:
PS C:\Temp> Dir | Test-Pipeline
MyCommand : Test-Pipeline
BoundParameters : {}
UnboundArguments : {}
ScriptLineNumber : 1
OffsetInLine : 7
HistoryId : 213
ScriptName :
Line : Dir | Test-Pipeline
PositionMessage : At line:1 char:7
+ Dir | Test-Pipeline
+ ~~~~~~~~~~~~~
PSScriptRoot :
PSCommandPath :
InvocationName : Test-Pipeline
PipelineLength : 2
PipelinePosition : 2
ExpectingInput : True
CommandOrigin : Runspace
DisplayScriptPosition :
【问题讨论】:
-
对于一个正确的书面管道,答案是否,因为你要接收的对象还不存在。话虽如此,您可能会考虑将所有对象分配到一个变量中(并使用
count属性),但这实际上会阻塞您的管道并将所有内容加载到内存中,这将失去管道的优势。
标签: powershell scripting pipeline