我不明白为什么在运行下面的脚本时,第二个“write-output”没有出现在脚本文件中?
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;
#Why is th second message not included int the transcript log file ???
Write-Output "2) A very simple message AFTER new-item.";
Stop-Transcript;
以下是我从笔录文件中得到的信息:
transcript file content
有人能解释一下吗?
成绩单文件:
Transcription démarrée, le fichier de sortie est c:\temp\test_transcript.txt
Répertoire : C:\
Path Owner Access
---- ----- ------ temp MyDomain\MyUser BUILTIN\XXX Allow FullControl
AUTORITE NT\XXX Allow FullControl
BUILTIN\XXX Allow ReadAndExecute, Synchronize
AUTORITE NT\XXX authentifiés Allow Modify, Synchronize
1) A very simple message BEFORE new-item.
EN CLAIR : Opération « Créer un fichier » en cours sur la cible « Destination : C:\temp\test_file_20230109_124005.txt ».
**********************
Fin de la transcription Windows PowerShell
Heure de fin : 20230109124005
**********************
控制台:
Transcription démarrée, le fichier de sortie est c:\temp\test_transcript.txt
Répertoire : C:\
Path Owner Access
---- ----- ------
temp MyDomain\MyUser BUILTIN\XXX Allow FullControl
AUTORITE NT\XXX Allow FullControl
BUILTIN\XXX Allow ReadAndExecute, Synchronize
AUTORITE NT\XXX authentifiés Allow Modify, Synchronize
1) A very simple message BEFORE new-item.
EN CLAIR : Opération « Créer un fichier » en cours sur la cible « Destination : C:\temp\test_file_20230109_124005.txt ».
Répertoire : 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.
Transcription arrêtée, le fichier de sortie est C:\temp\test_transcript.txt
1条答案
按热度按时间vxf3dgd41#
基于有用的评论:
Format-Table
for-display格式时,您会看到一个 * bug***(尽管它没有被归类为此类),这是异步行为的几种表现形式之一。****每个命令 *[繁琐、容易出错]**:将
Format-*
cmdlet * 显式 * 用于通常导致 * 表 * 格式设置 *(默认情况下)的任何调用,以便强制 * 同步 * 输出;在您情况下,请将| Format-Table
放在New-Item
调用之后。Format-Table
可防止您在尝试为变量赋值或在管道中进一步处理输出时将命令的输出 * 捕获为数据 *,因为Format-*
cmdlet发出的是 * 格式化指令 *,而不是数据。****脚本范围 [引入300毫秒的延迟]**:正如您所发现的, 在以下条件下 *,在末尾插入
Start-Sleep
会有所帮助:Write-Output "2) A very simple message AFTER new-item."
调用中。(注意,您可以省略Write-Output
以利用PowerShell的隐式输出行为)。Start-Sleep -MilliSeconds 300
必须 * 放在 * it**之前,这将强制后面的同步输出也呈现 * pending异步 * 输出。Start-Transcript
的使用,而是后者以特定于该cmdlet的方式 * 体现 ),如果您 * 不 * 显式使用Format-Table
调用,则会存在一般性 * 陷阱:Format-Table
调用避免了这个问题(同时也强制 * synchronous * 输出),代价是不输出 * data *,如上所述。一个简单的例子:
当
Format-Table
被 * 隐式 * 应用于输出到显示器时,您将看到臭名昭著的300毫秒延迟的另一种表现形式-有关详细信息,请参见this answer。虽然典型的表现是输出出现 * 无序 *(跨不同的输出流),但在您的情况下,信息 * 丢失 *,这显然是一个更严重的问题。PowerShell CLI也可能发生数据丢失。请参阅下面的GitHub问题。
相关GitHub问题:
Start-Transcript
相关)。