由于某种原因,对象在sleep命令执行完之前不会输出。
[pscustomobject]@{message = 'hi'}; sleep 5
字符串
还有一个例子。在循环结束之前,您不会看到输出。
foreach ($i in 1..60) {
if ($i -eq 1) { [pscustomobject]@{message = $i} }
sleep 1
}
型
我猜你必须输出至少2个对象才能看到任何东西?¯_()_/¯ 15秒后,您将看到两个对象。
foreach ($i in 1..60) {
if ($i -eq 1 -or $i -eq 15) { [pscustomobject]@{message = $i} }
sleep 1
}
型
或者输出足够的属性(> 4)来隐式调用format-list而不是format-table。* 格式表是问题。* 这马上出来。
[pscustomobject]@{a=1; b=2; c=3; d=4; e=5}; sleep 10
型
我想知道是否可以像-NoWait
一样添加一个参数到format-table。
格式化文件包含列宽的已知对象类型不存在此问题。
foreach ($i in 1..60) {
if ($i -eq 1) { get-process powershell }
sleep 1
}
型
或默认为format-custom的对象:
foreach ($i in 1..60) {
if ($i -eq 1) { get-date }
sleep 1
}
型
3条答案
按热度按时间lnvxswe21#
tl;dr
Format-Table
**-无论是 * 隐式 ,如您的情况*,还是显式-display 输出可以 * 视情况 * 延迟 ,(至少)300毫秒*(请参阅下一节了解原因和时间),这具有以下含义:Start-Sleep
submitted before the delay has elapsed(至少)the duration of sleep.Format-Table
只能检测300毫秒的延迟是否已经过去 * 如果并且当它重新获得控制权 *,这只有在输入命令 * 发出另一个输出对象 * 或 * 终止 * 时才会发生。*Format-Table
,* 后续 *Write-Host
或Out-Host
调用可能会产生意外出现 * 第一个 * 的输出,以及任何针对output stream * 而不是成功输出流的调用,例如调用Write-Warning
或Write-Verbose
。Out-Host
或Format-Table
(或任何其他Format-*
cmdlet)来 * 强制 * 同步 * 显示 * 输出;也就是说,然后保持不同流之间的输出顺序。字符串
背景信息:
这个行为由臭名昭著的PSv5+ asynchronous behavior of implicitly applied
Format-Table
output解释:对于没有预定义格式数据的数据类型 *,具有 *4个或更少的属性 (这是自动选择 * 表 * 显示),它等待长达300毫秒。在显示输出之前,努力确定合适的列宽。如果在该时间段之前使用
Start-Sleep
, 输出将延迟(至少)睡眠时间 *,因为Format-Table
不会重新获得控制权,直到它 * 接收到输入命令的下一个输出对象 * 或 * 输入命令终止 *。但是,发生 * 不 * 触发隐式
Format-Table
的输出对象不受影响:型
相比之下,由于命令的输出是一个只有 1 属性的对象,并且其类型(
[pscustomobject]
)没有与之关联的预定义格式设置数据,因此它会触发隐式Format-Table
设置,因此会出现问题。简而言之:以下命令输出会受到影响,因为它们选择了隐式
Format-Table
输出,但缺少预定义的列宽,因此需要延迟:about_Format.ps1xml
),对于[pscustomobject]
示例通常是这样。New-Guid
输出的System.Guid
类型示例)。Format-Table
和calculated properties来 * 预定义每个显示属性(列)的列宽 *;然而,注意,这再次仅适用于 to-display 输出;例如:型
类型 * 没有 * 格式化数据有 5或更多属性 * 默认隐式应用
Format-List
,其中,由于逐行输出,不需要确定有用的列宽,因此没有延迟。请注意,这只是一个 * 显示 * 问题*,如果命令被捕获或发送到管道,则数据 * 会 * 立即输出(尽管命令在
Start-Sleep
周期过去之前不会完成):型
虽然有几种方法可以 * 强制 * 同步(立即)显示输出,但它们都 * 改变了命令的基本行为**:
型
xkftehaa2#
将自定义对象通过管道传输到
Out-Host
cmdlet:字符串
使用
Out-Host
cmdlet时,会立即向主机显示结果。如果没有它,对象将输出到管道,直到Start-Sleep
cmdlet之后才返回管道。axr492tv3#
输出少于5个属性,并且format-table隐式运行。在显示第一个对象之前,Format-table将等待第二个对象 * 不确定 * 的时间。这适用于没有xml文件的对象类型(如pscustomobject),它们定义了一个 default 表视图。
字符串
与format-list比较:
型