如何在PowerShell的foreach循环中避免整数日志问题?
解决PowerShell foreach循环中的整数日志问题
嘿,我明白你在PowerShell的foreach循环里碰到了那些莫名其妙的整数日志输出问题——大概率是集合操作或者方法调用的返回值偷偷跑到控制台了,咱们来搞定它!
先看看你写的脚本片段(我帮你格式化好了):
foreach ($li in $list) { try { #check ID in the hashtable for new topics if ($TopicUpdates.ContainsKey($li["ID"].ToString())) { $li["Topics"] = $TopicUpdates[($li["ID"].ToString())] $li.SystemUpdate($false) } else { $li["Topics"] = 'About' $temp = "" | select "Title", "ID" $temp.Title= $li["Title"] $temp.ID= $li["ID"] if ($li.File.CheckOutStatus -eq "None") { $li.SystemUpdate($false) } else { $CheckedOutAlbums.Add($temp) } $NonExistingTopics.Add(...) } } catch { # 建议这里加上异常处理,避免循环中断 Write-Error "处理项ID $($li["ID"])时出错: $_" } }
问题根源
你看到的“整数日志”基本来自两个地方:
- 集合的
Add()方法:比如$CheckedOutAlbums.Add($temp)和$NonExistingTopics.Add(...),如果这些是ArrayList或者类似的集合类型,Add()会返回添加元素的索引(一个整数),PowerShell默认会把这个返回值输出到控制台。 - 未处理的方法返回值:像
$li.SystemUpdate($false)这类方法,虽然大部分时候返回$null,但某些场景下可能会返回状态值,同样会被输出。
修复方案
只需要把这些会输出返回值的操作“吃掉”返回值就行,有两种常用方式:
1. 用$null =接收返回值
这是最常用的方式,直接把返回值赋值给$null,避免输出:
foreach ($li in $list) { try { $itemId = $li["ID"].ToString() # 提前存ID,避免重复转换 #check ID in the hashtable for new topics if ($TopicUpdates.ContainsKey($itemId)) { $li["Topics"] = $TopicUpdates[$itemId] $null = $li.SystemUpdate($false) # 抑制输出 } else { $li["Topics"] = 'About' $temp = "" | select "Title", "ID" $temp.Title= $li["Title"] $temp.ID= $li["ID"] if ($li.File.CheckOutStatus -eq "None") { $null = $li.SystemUpdate($false) # 抑制输出 } else { $null = $CheckedOutAlbums.Add($temp) # 吃掉Add的索引返回值 } $null = $NonExistingTopics.Add(...) # 同样处理这个Add操作 } } catch { Write-Error "处理项ID $itemId时出错: $_" } }
2. 用| Out-Null过滤输出
如果习惯管道操作,也可以用这个方式:
$li.SystemUpdate($false) | Out-Null $CheckedOutAlbums.Add($temp) | Out-Null
另外建议你加上catch块处理异常,避免循环因为单个项出错就直接中断,这样调试起来也更方便。
内容的提问来源于stack exchange,提问作者bier hier
相关产品推荐
相关产品推荐

