POWERSHELL:在格式化表和新建项之后,成绩单无法正常工作

taor4pac  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(112)

我不明白为什么在运行下面的脚本时,第二个“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
vxf3dgd4

vxf3dgd41#

基于有用的评论:

    • TL;医生**
      • 当PowerShell * 隐式 * 应用Format-Table for-display格式时,您会看到一个 * bug***(尽管它没有被归类为此类),这是异步行为的几种表现形式之一。
      • 变通办法,全部 * 次优***,遗憾的是:
        ****每个命令 *[繁琐、容易出错]**:将Format-* cmdlet * 显式 * 用于通常导致 * 表 * 格式设置 *(默认情况下)的任何调用,以便强制 * 同步 * 输出;在您情况下,请将| Format-Table放在New-Item调用之后。
  • 注:
  • 使用Format-Table可防止您在尝试为变量赋值或在管道中进一步处理输出时将命令的输出 * 捕获为数据 *,因为Format-* cmdlet发出的是 * 格式化指令 *,而不是数据。
    ****脚本范围 [引入300毫秒的延迟]**:正如您所发现的, 在以下条件下 *,在末尾插入Start-Sleep会有所帮助:
      • 脚本必须以 * synchronized * 输出到 * success * 输出流**的命令结束(即,它必须 * 不 * 是隐式表格式的),特别是通过输出 * string *,如在Write-Output "2) A very simple message AFTER new-item."调用中。(注意,您可以省略Write-Output以利用PowerShell的隐式输出行为)。
      • Start-Sleep -MilliSeconds 300必须 * 放在 * it**之前,这将强制后面的同步输出也呈现 * pending异步 * 输出。
  • 但是,由于PowerShell的用于显示的输出格式化系统中的另一个设计限制(与异步行为分离)(请注意,两者都不是特定于Start-Transcript的使用,而是后者以特定于该cmdlet的方式 * 体现 ),如果您 * 不 * 显式使用Format-Table调用,则会存在一般性 * 陷阱
  • 如果脚本中的第一个隐式表格格式语句使用 * no * 预定义的格式化数据,它会为 * 所有后续的 * 隐式表格格式语句 * 锁定显示列,这可以使后者的输出有效地 * 不可见 *-参见this answer
  • 每个命令的Format-Table调用避免了这个问题(同时也强制 * synchronous * 输出),代价是不输出 * data *,如上所述。

一个简单的例子:

Start-Transcript t.txt

# This triggers *implicit* Format-Table output that is *asynchronous*,
# due to the output object having 4 or fewer properties and
# its type not having formatting-data associated with, as with the
# Get-Acl output in your question.
# NOTE:
#  * Curiously, the asynchronous behavior is also triggered in this case
#    if you append | Format-Table, but only affects SUBSEQUENT 
#    implicitly table-formatted statements, including those whose 
#    output types DO have formatting-data.
[pscustomobject] @{ Foo = 'Bar' }

# WORKAROUND:
#  Sleep for 300 msecs., then output *synchronously* to the success output stream.
#  This forces pending asynchronous table output to print. 
Start-Sleep -Milliseconds 300
"==== Done."

Stop-Transcript

Format-Table被 * 隐式 * 应用于输出到显示器时,您将看到臭名昭著的300毫秒延迟的另一种表现形式-有关详细信息,请参见this answer
虽然典型的表现是输出出现 * 无序 *(跨不同的输出流),但在您的情况下,信息 * 丢失 *,这显然是一个更严重的问题。PowerShell CLI也可能发生数据丢失。请参阅下面的GitHub问题。
相关GitHub问题

相关问题