0

这是代码:

$hash.GetEnumerator() | %{
    if($_.value.x -eq $null)
    {
        $hash.remove($_.name);
    }
}

如您所见,它在迭代哈希表时会修改哈希表。这样好吗?谢谢。

4

2 回答 2

1

我在 PowerShell 2.0 上试试这个:

$hash = @{"A1"="rouge";"A2"="vert";"A3"="bleu"}
$hash.GetEnumerator() | % { if($_.value -eq "bleu") {$hash.remove($_.name)}}

它给 :

Une erreur s'est produite lors de l'énumération parmi une collection : La collection a été modifiée ; l'opération d'énumérat
ion peut ne pas s'exécuter..
Au niveau de ligne : 1 Caractère : 1
+  <<<< $hash.GetEnumerator() | % { if($_.value -eq "bleu") {$hash.remove($_.name)}}
    + CategoryInfo          : InvalidOperation: (System.Collecti...tableEnumerator:HashtableEnumerator) [], RuntimeExceptio
   n
    + FullyQualifiedErrorId : BadEnumeration

原因是在枚举集合时尝试修改集合会引发异常。您可以尝试使用“for”语句。

如果你想使用foreach语句,你可以尝试:

$hash = @{"A1"="rouge";"A2"="vert";"A3"="bleu"}
[string[]]$t = $hash.Keys
$t |  % { if($hash[$_] -eq "vert") {$hash.remove($_)}}
$hash

Name                           Value
----                           -----
A3                             bleu
A1                             rouge
于 2013-07-24T07:28:30.467 回答
0
PS C:\> $h = @{ "a"=1; "b"=2; "c"=3; "d"=4 }
PS C:\> $h.GetEnumerator() | % {
>> if ($_.Value -eq 2) { $h.Remove($_.Name) }
>> "{0}: {1}" -f $_.Name, $_.Value
>> }
>>
a: 1
b: 2
An error occurred while enumerating through a collection: Collection was
modified; enumeration operation may not execute..
At line:1 char:1
+  <<<< $h.getenumerator() | % {
    + CategoryInfo          : InvalidOperation:
      (System.Collecti...tableEnumerator:HashtableEnumerator) [],
      RuntimeException
    + FullyQualifiedErrorId : BadEnumeration

在发布问题之前运行一个简单的测试真的那么难吗?

于 2013-07-24T07:29:58.253 回答