You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中数据类型判断的异常行为问题排查

问题原因与解决方案:PowerShell中foreach+switch类型检查误判字符串为整数

你的代码出现误判的核心原因大概率是哈希表的无序性,而非switch逻辑错误:

  • PowerShell中普通哈希表(@{})的键是无序存储的,遍历$collection.Keys时的顺序不一定和你定义的A、B、C、D顺序一致。你看到的第四个输出结果实际上可能对应键C(值为整数33),而键D(值为字符串"44")的结果可能在其他位置,显示为"It's a string"。

验证这一点很简单,在foreach循环中添加键和值的输出:

foreach($key in $collection.Keys){
  Write-Host "当前键: $key, 值: $($collection.$key)"
  switch ( ($collection.$key).GetType() ){
    { $_ -eq [int32]} {Write-Output "It's an integer"; break}
    { $_ -eq [string]} {Write-Output "It's a string"; break}
  }
}

执行后你会看到每个输出对应的实际键值,就能确认顺序问题。

另外,你的switch写法可以简化,不需要通过GetType()获取Type对象再比较,直接对值进行switch并匹配类型更直观可靠:

$collection = @{A = 1; B="abc"; C = 33; D = "44" }

foreach($key in $collection.Keys){
  switch ($collection.$key) {
    [int32] { Write-Output "键$key 对应值是整数"; break }
    [string] { Write-Output "键$key 对应值是字符串"; break }
  }
}

这种写法直接利用PowerShell switch对类型的原生支持,避免了Type对象比较的冗余,也更易读。

如果坚持要基于Type对象进行比较,你的代码逻辑本身是正确的,但可以优化为直接匹配Type对象而非用脚本块:

foreach($key in $collection.Keys){
  switch ($collection.$key.GetType()){
    [System.Int32] { Write-Host "It's an integer"; break }
    [System.String] { Write-Host "It's a string"; break }
  }
}

这种写法和你的脚本块写法效果一致,但更简洁。

内容的提问来源于stack exchange,提问作者Abdoul Karim Niang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 19:24:52