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

PowerShell函数返回哈希表赋值变量为空问题排查

问题根源:PowerShell函数的返回值是所有未抑制的输出集合

在PowerShell里,函数的返回值可不是只有return语句指定的内容——任何没被捕获或抑制的命令/表达式输出,都会被自动加入返回流。你的函数里有大量这类“意外输出”,导致返回的不是单纯的哈希表,而是一堆混合了布尔值、数字、哈希表项的对象数组:

  • 匹配判断语句(比如$data[$i] -match 'nmap scan report')的布尔结果会被输出
  • 赋值语句(比如$arr[$j]=@{})会把被赋的值输出
  • 递增/递减操作(比如$i++、$k--)会返回操作前的数值,同样会输出

当你直接调用函数时,这些杂项输出和哈希表一起打印出来,你可能只注意到了哈希表部分;但赋值给变量后,变量是个包含所有输出的数组,哈希表可能藏在数组末尾,或者你查看时误以为变量为空。


修复后的函数

我们可以用[void]()包裹所有会产生意外输出的语句,强制抑制它们的输出,让函数只返回你需要的哈希表:

Function BuildDaHash($data){
    $arr=@{} 
    $j=0 
    $k=0 
    For ($i=0; $i -lt $data.count; $i++){
        # 抑制匹配判断的布尔输出
        if ($null -ne ($data[$i] -match 'nmap scan report')) { 
            # 抑制空哈希表的赋值输出
            [void]($arr[$j]=@{}) 
            # 抑制IP行的赋值输出
            [void]($arr[$j][$k] = $data[$i]) 
            # 抑制递增操作的数值输出
            [void]($i++) 
            [void]($k++) 
            Do { 
                # 抑制端口行的赋值输出
                [void]($arr[$j][$k] = $data[$i].Split(' ')[0]) 
                [void]($i++) 
                [void]($k++) 
            # 抑制While条件的布尔输出
            } While ($null -ne ($data[$i] -notmatch 'nmap scan report' -and $i -lt $data.count)) 
            [void]($j++) 
            $k=0 
            [void]($i--) 
        } 
    } 
    return $arr 
}

验证效果

现在执行$test = BuildDaHash($string)后,$test就会是你预期的哈希表结构了。你可以通过$test[0]查看第一个IP的相关数据,$test[0][1]查看对应端口,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Shahar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:22:56