1

使用以下 2 行代码:

$meta = New-Object System.Management.Automation.CommandMetadata (Get-Command Get-Event)
$parametersInCmdlet = $meta.Parameters.GetEnumerator()

$parametersInCmdlet 变量的设置可以通过引用它来看到。

$parametersInCmdlet

Key               Value
---               -----
SourceIdentifier  System.Management.Automation.ParameterMetadata
EventIdentifier   System.Management.Automation.ParameterMetadata

当我在那之后立即再次引用它时,它显示为空(并且如果通过管道传输到 Get-Member 则已确认)。

$parametersInCmdlet | gm
gm : No object has been specified to the get-member cmdlet.
At line:1 char:23
+ $parametersInCmdlet | gm
+                       ~~
    + CategoryInfo          : CloseError: (:) [Get-Member], InvalidOperationException
    + FullyQualifiedErrorId : NoObjectInGetMember,Microsoft.PowerShell.Commands.GetMemberCommand

在这些引用之间没有其他[应该]触及该变量。这发生在 PS 2.0 和 3.0 的控制台和 ISE 中,因此我认为这更多的是用户误解而不是错误。

在这种情况下,什么会导致价值丢失?

4

1 回答 1

1

方法返回的对象GetEnumerator()几乎总是一个IEnumerator. an 的工作是一次IEnumerator交回一个集合的元素,直到该集合耗尽。在这一点上,IEnumerator当被要求提供下一个项目时,不返回任何内容是正确的行为。

当您第一次查看时,Powershell 会展开整个集合。因此,默认情况下,预计您无法再次查看该集合,因为该集合IEnumerator已被“使用”。

解决方法是Reset()IEnumerator您希望它重新开始时调用。假设IEnumerator正确实施,这将允许您重新从头开始重新读取集合。

$parametersInCmdlet.Reset()因此,请在再次使用之前尝试调用它。

于 2013-02-25T18:31:53.613 回答