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的内容因为缓冲顺序,也没来得及被转录捕获。
解决方法
可以通过以下任意一种方式修复:
- 抑制
New-Item的输出:将输出重定向到$null,避免产生缓冲输出New-Item -Path "C:\temp" -Name "test_file_$(Get-Date -f "yyyyMMdd_HHmmss").txt" -ItemType File -Verbose -ErrorAction Stop | Out-Null - 将输出赋值给变量:接收
New-Item的返回对象,避免其进入输出管道$newFile = New-Item -Path "C:\temp" -Name "test_file_$(Get-Date -f "yyyyMMdd_HHmmss").txt" -ItemType File -Verbose -ErrorAction Stop - 强制立即输出:用
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
相关产品推荐
相关产品推荐

