PowerShell脚本Out-File未将ping结果写入文本文件的问题
问题根本原因
脚本生成空白文件的核心原因是Write-Host的输出机制和管道传递逻辑不匹配:
Write-Host直接将内容渲染输出到控制台主机流,不会产生可被管道捕获的标准输出对象- 原代码中
Write-Host "$Server" | Out-File ...的写法,实际通过管道传递给Out-File的是空值,因此只会生成空白文件,无法写入主机名
快速排查验证
执行单条测试命令就能复现问题,确认根因:
- 在PowerShell控制台运行
Write-Host "测试内容" | Out-File -FilePath "C:\ps\test_check.txt" - 打开生成的test_check.txt,会发现文件没有任何内容,完全复现脚本里的空文件现象
修正后可用的脚本
保留原本控制台彩色提示的同时,将可被管道捕获的主机名正常写入文件:
$ServerName = Get-Content -Path 'C:\ps\user.txt' foreach ($Server in $ServerName) { if (Test-Connection -ComputerName $Server -Count 2 -Quiet) { # 控制台输出绿色可ping通提示 Write-Host "$Server" -ForegroundColor Green # 将主机名对象传递给Out-File写入pinged.txt $Server | Out-File "C:\ps\pinged.txt" -Append -Encoding utf8 } else { # 控制台输出红色不可ping通提示 Write-Host "$Server" -ForegroundColor Red # 将主机名对象传递给Out-File写入not_pinged.txt $Server | Out-File "C:\ps\not_pinged.txt" -Append -Encoding utf8 } }
补充注意事项
- 不同版本PowerShell对
Write-Host的管道支持规则有差异:PowerShell 5.x及更早版本的Write-Host完全不产生可被管道捕获的输出;PowerShell 7.x版本中Write-Host输出到独立的信息流,默认也不会被Out-File捕获,因此原写法在全版本PowerShell中都无法写入文件 - 追加写入时加上
-Encoding utf8参数,可避免生成的txt文件出现中文乱码问题
内容的提问来源于stack exchange,提问作者NT-ML
相关产品推荐
相关产品推荐

