为什么PowerShell中的变量在引用后会丢失其值?

时间:2013-02-25 18:21:40

标签: powershell

使用以下两行代码:

$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中,因此我认为这比用户更容易误解。

在这种情况下会导致价值丢失的原因是什么?

1 个答案:

答案 0 :(得分:1)

GetEnumerator()方法返回的对象几乎总是IEnumeratorIEnumerator的工作是一次一个地回收一个集合的元素,直到该集合耗尽为止。此时,IEnumerator在被要求下一个项目时没有返回任何内容是正确的行为。

Powershell会在您第一次看到它时展开整个系列。因此,默认情况下,由于IEnumerator已被“花费”,因此您不能再次查看该集合。

解决方法是,如果您希望重新开始Reset(),请致电IEnumerator。假设IEnumerator已正确实施,这将允许您再次从头开始重新阅读该集合。

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