gpt4 book ai didi

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

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

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

例如,用

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

输出是:

Name     Status----     ------Wi-Fi    UpEthernet DisconnectedPress Enter to continue...:

这是怎么回事?这是错误还是功能?

最佳答案

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

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

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

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

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 的结束 block 将在Pause 之前执行。在结束 block Format-Table 中知道它已经获得了所有输入,因此它可以决定列宽并立即输出所有收集的对象。隐式 Out-DefaultFormat-Table 输出中看到格式化对象,并且 Out-Default 知道它们不需要任何额外的格式化和打印他们也立即在主机(控制台)上。所以在调用 Pause 之前打印了整个表。

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

在以前版本的 PowerShell 中也可以注意到表格结束标记位置的差异。

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

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