You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 16:47:01