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
相关产品推荐
相关产品推荐

