如何让PowerShell中Write-Host输出同时显示到屏幕并写入文件?
解决PowerShell脚本同时输出到屏幕和文件的问题
针对你大量使用Write-Host且需要同时保留屏幕输出、写入文件的需求,提供两种实用方案:
方案1:自定义输出函数(适合长期修改脚本)
定义一个同时处理屏幕输出和文件写入的函数,直接替换脚本中所有Write-Host调用即可,保留原有参数格式:
# 定义自定义函数,支持原Write-Host的多参数格式 function Write-HostAndFile { param( [Parameter(ValueFromRemainingArguments=$true)] [string[]]$Messages, # 可自定义输出文件路径 [string]$FilePath = "dns-lookup-results.txt" ) $combinedMsg = $Messages -join " " # 输出到屏幕,保留原Write-Host的显示效果 Write-Host $Messages # 追加内容到文件 Add-Content -Path $FilePath -Value $combinedMsg }
修改后的脚本片段示例
修复原脚本语法错误后,替换所有Write-Host为Write-HostAndFile:
param($FName) # 插入上面的自定义函数 function Write-HostAndFile { param( [Parameter(ValueFromRemainingArguments=$true)] [string[]]$Messages, [string]$FilePath = "dns-lookup-results.txt" ) $combinedMsg = $Messages -join " " Write-Host $Messages Add-Content -Path $FilePath -Value $combinedMsg } $tgt = Import-Csv $FName $tgt | ForEach-Object { Write-HostAndFile "Checking IP Address $($_.IPAddr)" Resolve-DnsName -Name $_.IPAddr 2>$null | Out-Null $ResolvResult = $? if ($ResolvResult -eq $TRUE) { $RevHstName = Resolve-DnsName -name $_.IPAddr | Select-Object -Property NameHost -First 1 $RevHstName = $RevHstName -replace ".*=" -replace "}" # 修正split语法,点号需转义 $TestRoot = ($RevHstName -split "\.",3)[1] if (($TestRoot -like '*-servers*') -or ($TestRoot -like '*awsdns*')) { Write-HostAndFile $_.IPAddr "looks up as a ROOT or AWS SERVER" } else { Write-HostAndFile "Successful Lookup for" $_.IPAddr "is" $RevHstName } } # 省略其他逻辑 }
方案2:信息流重定向(无需修改脚本,临时使用)
PowerShell 5.1及以上版本中,Write-Host的输出属于信息流(编号6),可通过重定向将其导入成功输出流,再用Tee-Object同时输出到屏幕和文件。直接在调用脚本时执行:
.\你的脚本名.ps1 -FName 输入文件.csv 6>&1 | Tee-Object -FilePath 输出文件.txt
两种方案对比
- 自定义函数:需修改脚本,但可灵活控制文件路径、输出格式,适合长期维护的脚本。
- 信息流重定向:无需改动脚本,仅需在调用时添加参数,适合临时导出需求。
内容的提问来源于stack exchange,提问作者Tom Salciccia
相关产品推荐
相关产品推荐

