PowerShell 7循环输出自定义对象异常:首次输入无反馈,二次批量返回
PowerShell 7 自定义对象输出延迟问题解决
问题现象
在PowerShell 7中运行以下代码时,首次输入的内容不会立即返回,第二次输入后才会同时输出首次和第二次的结果,后续输入则恢复正常:
while ($true) { $Read = Read-Host $Obj = New-Object Object $Obj | Add-Member -MemberType NoteProperty -Name "Text" -Value $Read $Obj }
而直接输出字符串或哈希表的代码则能正常实时返回输入内容:
while ($true) { $Read = Read-Host $Read }
问题原因
这是PowerShell的格式化输出缓冲机制导致的:当输出类型为自定义对象时,PowerShell会先收集一定数量的同类型对象,再统一进行格式化输出以提升性能;而字符串、哈希表这类内置类型有预定义的格式化规则,会实时输出。
解决方法
可以通过以下几种方式强制实时输出自定义对象:
方法1:使用 Out-Host 强制实时输出
直接将自定义对象通过Out-Host输出,绕过缓冲机制:
while ($true) { $Read = Read-Host $Obj = New-Object Object $Obj | Add-Member -MemberType NoteProperty -Name "Text" -Value $Read $Obj | Out-Host }
方法2:直接写入控制台
使用[Console]::WriteLine()直接将内容输出到控制台,完全绕过PowerShell的输出缓冲:
while ($true) { $Read = Read-Host $Obj = New-Object Object $Obj | Add-Member -MemberType NoteProperty -Name "Text" -Value $Read # 输出对象的Text属性 [Console]::WriteLine($Obj.Text) # 如需输出完整对象结构,可转为JSON # [Console]::WriteLine($Obj | ConvertTo-Json -Compress) }
方法3:为自定义对象绑定格式化规则
如果需要保留结构化输出格式,可以提前为自定义对象定义格式化数据,让PowerShell识别并实时输出该类型:
# 定义自定义类型的格式化规则 Update-FormatData -AppendInput @" <?xml version="1.0" encoding="utf-8"?> <Configuration> <ViewDefinitions> <View> <Name>CustomInputObject</Name> <ViewSelectedBy> <TypeName>CustomInputObject</TypeName> </ViewSelectedBy> <TableControl> <TableHeaders> <TableHeader> <Label>Text</Label> <Width>50</Width> </TableHeader> </TableHeaders> <TableRowEntries> <TableRowEntry> <TableColumnItems> <TableColumnItem> <PropertyName>Text</PropertyName> </TableColumnItem> </TableColumnItems> </TableRowEntry> </TableRowEntries> </TableControl> </View> </ViewDefinitions> "@ # 修改代码,为对象标记自定义类型 while ($true) { $Read = Read-Host $Obj = New-Object Object $Obj | Add-Member -MemberType NoteProperty -Name "Text" -Value $Read $Obj.PSObject.TypeNames.Insert(0, "CustomInputObject") $Obj }
内容的提问来源于stack exchange,提问作者Samwell9854
相关产品推荐
相关产品推荐

