PowerShell脚本输出问题:如何让消息同时显示在控制台并写入文件?
问题:PowerShell脚本同时输出消息到控制台和文件
原脚本
$result = foreach ($user in $list) { $samname = $user.SamAccountName $manager = $user.Manager $name = $user.Name $managername = Get-ADUser -Filter "Name -eq '$manager'" | Select Name if ($managername.Name -eq $manager) { Write-Output "$manager 在AD中存在。" $dname = Get-ADUser -Filter "Name -eq '$manager'" | Select DistinguishedName Get-ADUser -Filter "SamAccountName -eq '$samname'" | Set-ADUser -Manager $dname } else { Write-Warning "$manager 在AD中不存在。" } } $result | Out-File -FilePath C:\testfile.txt -Width 500
背景说明
$manager = $user.Manager是从文件读取的姓名列表- 当
$manager存在于AD中时,执行Write-Output "$manager 在AD中存在。" - 通过
$managername变量判断AD中是否存在该经理
当前问题
- 控制台仅能看到
Write-Warning的输出,看不到Write-Output的内容 - 文本文件中仅写入
Write-Output的消息,Write-Warning的消息不会被写入 - 需要让两种消息同时出现在控制台和文本文件中
已尝试的方案
尝试1:使用Write-Host
移除$result,替换为Write-Host,但无法写入文件:
foreach ($user in $list) { $samname = $user.SamAccountName $manager = $user.Manager $name = $user.Name $managername = Get-ADUser -Filter "Name -eq '$manager'" | Select Name if ($managername.Name -eq $manager) { $if = Write-Host "$manager 在AD中存在。" $dname = Get-ADUser -Filter "Name -eq '$manager'" | Select DistinguishedName Get-ADUser -Filter "SamAccountName -eq '$samname'" | Set-ADUser -Manager $dname } else { $else = Write-Host "$manager 在AD中不存在。" } } $if, $else | Out-File -FilePath C:\testfile.txt -Width 500
尝试2:将Write-Output赋值给变量
消息显示在控制台,但无内容写入文件:
foreach ($user in $list) { $samname = $user.SamAccountName $manager = $user.Manager $name = $user.Name $managername = Get-ADUser -Filter "Name -eq '$manager'" | Select Name if ($managername.Name -eq $manager) { $if = Write-Output "$manager 在AD中存在。" $dname = Get-ADUser -Filter "Name -eq '$manager'" | Select DistinguishedName Get-ADUser -Filter "SamAccountName -eq '$samname'" | Set-ADUser -Manager $dname } else { $else = Write-Output "$manager 在AD中不存在。" } } $if, $else | Out-File -FilePath C:\testfile.txt -Width 500
尝试3:仅使用Write-Output
两种消息都显示在控制台,但不知道如何写入文件:
foreach ($user in $list) { $samname = $user.SamAccountName $manager = $user.Manager $name = $user.Name $managername = Get-ADUser -Filter "Name -eq '$manager'" | Select Name if ($managername.Name -eq $manager) { Write-Output "$manager 在AD中存在。" $dname = Get-ADUser -Filter "Name -eq '$manager'" | Select DistinguishedName Get-ADUser -Filter "SamAccountName -eq '$samname'" | Set-ADUser -Manager $dname } else { Write-Output "$manager 在AD中不存在。" } }
解决方案
方法1:统一使用Write-Output并通过Tee-Object分流
PowerShell中Write-Output会将内容发送到管道,用Tee-Object可以实现同时输出到控制台和写入文件:
$output = foreach ($user in $list) { $samname = $user.SamAccountName $manager = $user.Manager $name = $user.Name # 直接获取姓名字符串,避免后续判断空值问题 $managername = Get-ADUser -Filter "Name -eq '$manager'" | Select -ExpandProperty Name if ($managername -eq $manager) { $message = "$manager 在AD中存在。" Write-Output $message $dname = Get-ADUser -Filter "Name -eq '$manager'" | Select -ExpandProperty DistinguishedName Get-ADUser -Filter "SamAccountName -eq '$samname'" | Set-ADUser -Manager $dname } else { $message = "$manager 在AD中不存在。" Write-Output $message } } # Tee-Object同时写入文件和输出到控制台,Out-Null避免重复输出 $output | Tee-Object -FilePath C:\testfile.txt -Width 500 | Out-Null
方法2:合并警告流与输出流(保留警告样式)
如果需要保留Write-Warning的黄色警告样式,可以将警告流(编号3)重定向到输出流(编号1),再用Tee-Object处理:
$result = foreach ($user in $list) { $samname = $user.SamAccountName $manager = $user.Manager $name = $user.Name $managername = Get-ADUser -Filter "Name -eq '$manager'" | Select -ExpandProperty Name if ($managername -eq $manager) { Write-Output "$manager 在AD中存在。" $dname = Get-ADUser -Filter "Name -eq '$manager'" | Select -ExpandProperty DistinguishedName Get-ADUser -Filter "SamAccountName -eq '$samname'" | Set-ADUser -Manager $dname } else { Write-Warning "$manager 在AD中不存在。" } } # 3>&1将警告流合并到输出流,同时保留控制台警告样式 $result 3>&1 | Tee-Object -FilePath C:\testfile.txt -Width 500 | Out-Null
方法3:自定义日志函数(灵活控制)
写一个自定义函数,同时处理控制台输出和文件写入,适合需要持续记录日志的场景:
function Write-Log { param( [string]$Message, [switch]$IsWarning ) # 根据参数选择输出方式 if ($IsWarning) { Write-Warning $Message } else { Write-Output $Message } # 追加写入文件 Add-Content -Path C:\testfile.txt -Value $Message } foreach ($user in $list) { $samname = $user.SamAccountName $manager = $user.Manager $name = $user.Name $managername = Get-ADUser -Filter "Name -eq '$manager'" | Select -ExpandProperty Name if ($managername -eq $manager) { Write-Log -Message "$manager 在AD中存在。" $dname = Get-ADUser -Filter "Name -eq '$manager'" | Select -ExpandProperty DistinguishedName Get-ADUser -Filter "SamAccountName -eq '$samname'" | Set-ADUser -Manager $dname } else { Write-Log -Message "$manager 在AD中不存在。" -IsWarning } }
内容的提问来源于stack exchange,提问作者865296
相关产品推荐
相关产品推荐

