PowerShell中StreamWriter.WriteLine写入文件中断问题求助
PowerShell StreamWriter 写入文件内容不完整的修复方案
问题原因
[System.IO.StreamWriter] 默认采用缓冲机制写入数据,若未主动刷新缓冲区或关闭流,缓冲区中剩余的未写入数据会丢失,导致文件内容截断。而Add-Content内部会自动处理流的打开、刷新和关闭逻辑,因此不会出现这类问题。
两种可靠的解决方法
方法1:用try/finally手动管理流生命周期
通过手动调用Flush()和Close()/Dispose(),确保所有数据都写入文件:
# 获取按HandleCount降序排列的进程列表 $sortedProcesses = Get-Process | Sort-Object -Property HandleCount -Descending # 初始化StreamWriter $writer = New-Object System.IO.StreamWriter -ArgumentList "D:\ProcessSorted.txt" try { foreach ($proc in $sortedProcesses) { # 自定义输出格式,可根据需求调整 $outputLine = "PID: $($proc.Id) | 进程名: $($proc.ProcessName) | 句柄数: $($proc.HandleCount)" $writer.WriteLine($outputLine) # 可选:大文件场景下可每写入一行就刷新一次缓冲区 # $writer.Flush() } } finally { # 必须执行:关闭流并释放资源,强制写入剩余缓冲数据 $writer.Close() $writer.Dispose() }
方法2:用using语句自动管理流(推荐)
PowerShell支持using块,代码块结束时会自动释放流资源,无需手动调用关闭方法:
$sortedProcesses = Get-Process | Sort-Object HandleCount -Descending # using块会自动处理流的创建、使用和释放 using ($writer = New-Object System.IO.StreamWriter "D:\ProcessSorted.txt") { foreach ($proc in $sortedProcesses) { $outputLine = "PID: $($proc.Id) | 进程名: $($proc.ProcessName) | 句柄数: $($proc.HandleCount)" $writer.WriteLine($outputLine) } }
验证方式
运行脚本后,用以下命令对比进程总数和文件行数:
# 获取进程总数 (Get-Process | Sort-Object HandleCount -Descending).Count # 获取文件行数 (Get-Content "D:\ProcessSorted.txt").Count
两者数值一致则说明内容完整。
内容的提问来源于stack exchange,提问作者Altiubb
相关产品推荐
相关产品推荐

