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. の仕事は、IEnumeratorコレクションがなくなるまで、コレクションの要素を一度に 1 つずつ戻すことです。その時点でIEnumerator、次の項目を求められたときに が何も返さないのは正しい動作です。

初めてコレクションを表示すると、Powershell はコレクション全体を展開します。IEnumeratorしたがって、デフォルトでは、コレクションはすでに「使用済み」であるため、コレクションを再度表示することはできません。

回避策は、最初からやり直したい場合Reset()にを呼び出すことです。IEnumeratorが適切に実装されていると仮定するとIEnumerator、コレクションを最初からもう一度読み直すことができます。

そのため、もう一度使用する前に電話してみてください$parametersInCmdlet.Reset()

于 2013-02-25T18:31:53.613 に答える