gpt4 book ai didi

powershell - 选择对象后无法暂停或 sleep

转载 作者:行者123 更新时间:2023-12-04 07:51:50 25 4
gpt4 key购买 nike

在某些情况下,如果我尝试在 Select-Object 之后暂停或 sleep 命令,暂停/ sleep 发生在命令之前。

例如,与

Get-NetAdapter | Select-Object Name,Status
Pause

或者
Get-NetAdapter | Select-Object Name,Status | Where-Object {$_ -ne $null}
Pause

输出是:
Press Enter to continue...:Name     Status----     ------Wi-Fi    UpEthernet Disconnected

Whereas with

Get-NetAdapter | Select-Object Name,Status | Format-Table
Pause

输出是:

姓名 状态
---- ------
无线上网
以太网断开

按 Enter 继续...:

这里发生了什么?这是错误还是功能?

最佳答案

您看到的是新 PowerShell v5 功能的结果。 Format-Table现在收集 300 毫秒的输入以找到更好的列宽。即使您明确指定 -AutoSize:$false,它也会以这种方式工作.

当您在命令提示符中键入 command 时,该命令会隐式传送到 Out-Default 的单个实例中命令。 Out-Default命令然后决定如何格式化对象并在 PowerShell 主机(控制台)上打印它们。这样,即使您不使用 Format-Table直接在您的代码中,这并不意味着您没有 Format-Table在您的管道中。 Out-Default可以决定将对象格式化为表格并使用 Format-Table内部。

具有四个或更少属性且未在格式文件中为其定义自定义格式的自定义对象被格式化为表格。通过使用 Select-Object使用两个属性,您可以准确地生成该对象。

PowerShell 管道是单线程的。这意味着 Format-Table不能只在 300 毫秒间隔过去时输出所有收集的对象。 Format-Table必须等到您通过管道将下一个项目(进程块调用)或管道结束报告(结束块调用)。

PS> Get-NetAdapter | Select-Object Name,Status
>>> Pause
>>> [PSCustomObject]@{Name='Some long name';Status='Some long status'} #1
>>> Pause
>>> [PSCustomObject]@{Name='Even longer name';Status='Even longer status'}
>>> Pause

Press Enter to continue...:
Name Status
---- ------
Ethernet Up
Some long name Some long status
Press Enter to continue...:
Even longer... Even longer s...
Press Enter to continue...:


PS>

隐式 Format-Table在第一个 Pause 之前不打印任何内容(严格地说它打印空行)因为它仍在等待更多的输入对象(尚未经过 300 毫秒)来决定列宽。当第一个对象 (#1) 在 300 毫秒间隔后出现时(假设您不快速按下 Enter),则 Format-Table决定列宽并打印所有收集的对象。任何其他对象将立即打印,但它们不再影响列宽。如果列的值太大,它将被截断。

PS> Get-NetAdapter | Select-Object Name,Status | Format-Table
>>> Pause

Name Status
---- ------
Ethernet Up


Press Enter to continue...:
PS>

使用此代码,结束显式 Format-Table 的块将在 Pause 之前执行.在结束块 Format-Table知道它已经获得了所有输入,因此它可以决定列宽并立即输出所有收集的对象。隐式 Out-Default看到来自 Format-Table 的格式化对象输出,和 Out-Default知道它们不需要任何额外的格式并立即在主机(控制台)上打印它们。所以在 Pause 之前打印了整个表格调用。

请注意表格结束标记(两个空行)位置的不同。在第一个示例中,它放在最后一个 Pause 之后.那是因为隐含 Format-Table仍然处于事件状态并仍在等待,您将其他对象传递给它。仅当您的命令完全完成时 Format-Table确认输入结束和表标记输出结束。在第二个示例中,显式 Format-Table之前完成 Pause ,所以在 Pause 之前打印了整个表(包括表尾标记)命令。

表格结束标记位置的不同也可以在 PowerShell 的早期版本中注意到。

关于powershell - 选择对象后无法暂停或 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34835327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com