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

PowerShell中Format-Table与New-Item后Transcript记录缺失问题求助

为什么PowerShell脚本中第二条Write-Output内容未出现在Transcript日志中?

我运行以下PowerShell脚本时,第二条Write-Output的内容没有出现在Transcript日志文件里,请问这是什么原因?

脚本代码

Start-Transcript -Path "c:\temp\test_transcript.txt" -Append;
    
$acl = Get-Acl "c:\temp";
$acl | Format-Table -Wrap;

Write-Output "1) A very simple message BEFORE new-item.";
New-Item -Path "C:\temp" -Name "test_file_$(Get-Date -f "yyyyMMdd_HHmmss").txt" -ItemType File -Verbose -ErrorAction Stop;

# 为什么第二条消息没被包含在转录日志里?
Write-Output "2) A very simple message AFTER new-item.";

Stop-Transcript;

Transcript日志内容

转录已启动,输出文件为c:\temp\test_transcript.txt
    
    
        目录: C:\
    
    
    Path Owner              Access
    ---- -----              ------ temp MyDomain\MyUser BUILTIN\XXX Allow  FullControl
                            NT AUTHORITY\XXX Allow  FullControl
                            BUILTIN\XXX Allow  ReadAndExecute, Synchronize
                            NT AUTHORITY\XXX 已认证用户 Allow  Modify, Synchronize
    
    
    1) A very simple message BEFORE new-item.
详细信息: 正在对目标执行“创建文件”操作,目标路径: C:\temp\test_file_20230109_124005.txt。
    
    **********************
Windows PowerShell转录结束
结束时间: 20230109124005
    **********************

控制台输出

转录已启动,输出文件为c:\temp\test_transcript.txt


    目录: C:\


Path Owner              Access
---- -----              ------
temp MyDomain\MyUser BUILTIN\XXX Allow  FullControl
                        NT AUTHORITY\XXX Allow  FullControl
                        BUILTIN\XXX Allow  ReadAndExecute, Synchronize
                        NT AUTHORITY\XXX 已认证用户 Allow  Modify, Synchronize


1) A very simple message BEFORE new-item.
详细信息: 正在对目标执行“创建文件”操作,目标路径: C:\temp\test_file_20230109_124005.txt。


    目录: C:\temp


Mode          LastWriteTime Length Name
----          ------------- ------ ----
-a---- 09/01/2023     12:40      0 test_file_20230109_124005.txt
2) A very simple message AFTER new-item.
转录已停止,输出文件为C:\temp\test_transcript.txt

原因解释

这是PowerShell管道输出缓冲机制和Stop-Transcript的日志终止时机共同导致的问题:

  • New-Item在未被赋值给变量或通过管道接收时,会返回创建的FileInfo对象并输出到管道。
  • PowerShell的格式化系统会延迟处理这类对象的输出,直到脚本执行到需要刷新缓冲的节点(比如脚本结束、显式调用输出命令)。
  • 当执行Stop-Transcript时,日志系统会立即停止记录,此时New-Item返回的FileInfo对象还在输出缓冲中,尚未被格式化写入日志;同时第二条Write-Output的内容因为缓冲顺序,也没来得及被转录捕获。

解决方法

可以通过以下任意一种方式修复:

  1. 抑制New-Item的输出:将输出重定向到$null,避免产生缓冲输出
    New-Item -Path "C:\temp" -Name "test_file_$(Get-Date -f "yyyyMMdd_HHmmss").txt" -ItemType File -Verbose -ErrorAction Stop | Out-Null
    
  2. 将输出赋值给变量:接收New-Item的返回对象,避免其进入输出管道
    $newFile = New-Item -Path "C:\temp" -Name "test_file_$(Get-Date -f "yyyyMMdd_HHmmss").txt" -ItemType File -Verbose -ErrorAction Stop
    
  3. 强制立即输出:用Out-Host强制New-Item的输出立即显示,确保缓冲被写入日志
    New-Item -Path "C:\temp" -Name "test_file_$(Get-Date -f "yyyyMMdd_HHmmss").txt" -ItemType File -Verbose -ErrorAction Stop | Out-Host
    

内容的提问来源于stack exchange,提问作者RaFla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 08:22:50