将 Write-Host
输出与输出对象、字符串和 PowerShell 听录混合使用很复杂。 脚本与听录使用 PowerShell 管道的方式之间存在微妙的交互,这可能会产生意想不到的结果。
从脚本发出对象时,这些对象的格式由 Out-Default
进行处理。 但是,脚本完成并停止听录后,可能会发生格式设置。 这意味着输出不会被转录。 字符串的处理方式有所不同。 有时,字符串输出通过格式传递,但并非总是如此。 Write-Host
会立即写入主机进程。 Write-Object
通过格式设置系统发送。 将复杂对象的输出与到主机的写入相结合使得很难预测哪些内容会记录到转录中。
请考虑以下脚本及其输出:
控制台的输出显示预期的输出,但不按预期的顺序显示。 Write-Host 4
显示在 Get-Location
之前,因为 Write-Host
已经过优化,会直接写入主机。 听录中有一个代码,用于将输出复制到转录文件和控制台。 然后,我们就有了作为脚本输出发送的常规
由于在脚本退出前已关闭听录,因此不会在转录中呈现。 对象已发送给管道中的下一个使用者。 在本例中是 Out-Default
,它是由 PowerShell 自动插入的。 为了进一步复杂化,字符串的输出也会在格式设置系统中得到优化。 第一个 Write-Output 2
被发出并由转录捕获。 但是,插入
Get-Location
对象会导致其输出推送到需要实际格式设置的内容堆栈中,这将为可能还需要格式设置的任何其余对象设置一些状态。 正因如此,第二个 Write-Output 5
脚本未添加到转录中。
请考虑以下脚本及其输出:
我们可以看到,Write-Host
命令发生在任何内容之前,然后对象开始出现。字符串的 Write-Output
强制对象在屏幕上呈现,但请注意转录仅包含 Write-Host
的输出。 这是因为这些字符串对象在脚本关闭听录后通过管道传递给 Out-Default
进行格式设置。
在此场景中,复杂对象的输出位于脚本末尾。
此示例与最初的场景相比略有差别,但现在所有内容都记录到转录中。 原始代码包装在脚本块中,格式化程序通过 Out-Default
显式调用。
请注意,最后一次 Write-Host
调用仍然无序,这是因为 Write-Host
中的优化不会进入输出流。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。