如何通过管道将字符串添加至PowerShell的Generic.List以替代Out-File
日志写入List的简化方案
问题背景
原本的脚本通过Out-File逐行追加日志到文件:
$log_txt = 'c:\logging.txt' #do stuff "Message 1" | Out-File $log_txt -Append #do more stuff "Message 2" | Out-File $log_txt -Append
希望调整为先将日志消息存入System.Collections.Generic.List[System.Object],最后一次性写入文件,且无需将每一行日志改为$List.Add("Message")的形式,只需替换管道后的命令,方便后续回退。
可行解决方案
方案1:使用内置ForEach-Object直接添加(无需自定义函数)
直接将原管道中的Out-File命令替换为ForEach-Object { $list.Add($_) },无需修改日志行本身:
$list = New-Object System.Collections.Generic.List[System.Object] $log_txt = 'c:\logging.txt' #do stuff "Message 1" | ForEach-Object { $list.Add($_) } #do more stuff "Message 2" | ForEach-Object { $list.Add($_) } # 最后一次性写入文件 $list | Out-File $log_txt -Append
方案2:自定义管道函数(语义更清晰)
如果希望命令语义更明确,可以定义一个专门的管道函数Add-ToList,之后直接替换管道命令即可:
# 定义管道函数 function Add-ToList { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [System.Collections.Generic.List[object]]$List, [Parameter(ValueFromPipeline=$true)] [object]$InputObject ) process { $List.Add($InputObject) } } # 使用示例 $list = New-Object System.Collections.Generic.List[System.Object] $log_txt = 'c:\logging.txt' #do stuff "Message 1" | Add-ToList -List $list #do more stuff "Message 2" | Add-ToList -List $list # 最后一次性写入文件 $list | Out-File $log_txt -Append
方案优势
- 两种方案都只需替换管道后的命令,原日志行完全无需修改,大幅减少改动量
- 后续回退时,只需将管道命令换回
Out-File $log_txt -Append即可,操作成本极低
内容的提问来源于stack exchange,提问作者sleven
相关产品推荐
相关产品推荐

