Powershell hash containskey错误地返回false

我有一个Power
shell脚本,它获取远程桌面用户会话的列表,并通过SessionID将它们放入哈希.

# Create a hashtable which contains all of the remote desktop sessions by SessionId
$userSessionBySessionID = @{}
ForEach($userSession in Get-RDUserSession -CollectionName $collectionName)
{
    $userSessionBySessionID.Add($userSession.SessionId, $userSession)
}

然后,我可以在PowerShell ISE中转储$userSessionByID

Name                           Value                                                                                                                                                                                                          
----                           -----                                                                                                                                                                                                          
9                              Microsoft.RemoteDesktopServices.Management.RDUserSession                                                                                                                                                       
8                              Microsoft.RemoteDesktopServices.Management.RDUserSession                                                                                                                                                       
7                              Microsoft.RemoteDesktopServices.Management.RDUserSession                                                                                                                                                       
6                              Microsoft.RemoteDesktopServices.Management.RDUserSession                                                                                                                                                       
5                              Microsoft.RemoteDesktopServices.Management.RDUserSession                                                                                                                                                       
4                              Microsoft.RemoteDesktopServices.Management.RDUserSession                                                                                                                                                       
2                              Microsoft.RemoteDesktopServices.Management.RDUserSession                                                                                                                                                       
1                              Microsoft.RemoteDesktopServices.Management.RDUserSession       

令人沮丧的是$userSessionBySessionID.ContainsKey(4)返回false.我在这里错过了什么?我也尝试了$userSessionBySessionID.ContainsKey(“4”),但这也返回false.

最佳答案

I think the issue may be that $userSession.SessionId.GetType() returns [UInt32]

在测试中这是你的问题.考虑以下测试,我使用[UInt32]创建一个哈希表.

$test = @{}
1..10 | %{$test.add($_ -as [uint32],$_%2)}

正如您所见,运行$test.containskey(6)会返回false.我也遇到了与$test.containskey(“6”)相同的问题.然而,这返回真实….

$test.containskey(6 -as [uint32])

注意:您不需要在这里使用-as运算符,因为您可以使用[uint32] 6进行简单的转换,但是如果您使用包含整数的变量-as将会有所帮助.

密钥本身可以靠近任何对象,并且containskey()在所有情况下都返回正确的结果.您的哈希表没有带整数6的键.此外,[uint32] cannot be converted to [int] since it has a higher upper bound因此无法进行强制转换.这就是PowerShell或底层.Net不会进行“自动”转换的原因.在实践中,我认为在这种情况下不会发生这种情况.

Point确保你是类型感知的.

与上面相同的例子,除了这次我们使用整数.

1..10 | %{$test.add($_,$_%2)}

$test.containskey(6)
True

$test.containskey("6")
False

当我用字符串创建键时,我可以反转调查结果.

1..10 | %{$test.add("$_",$_%2)}

$test.containskey(6)
False

$test.containskey("6")
True
点赞