【问题标题】:How can I store output from Format-Table for later use如何存储格式表的输出以供以后使用
【发布时间】:2017-01-04 08:47:18
【问题描述】:

我有一个脚本,它可以创建多个作业并在作业中存储两个简单的值。

Start-Job -ScriptBlock {param ([string]$compip) tnc $compip | select RemoteAddress,PingSucceeded -WarningAction SilentlyContinue} -ArgumentList $compip

这很好用。我想知道的是如何将以下代码存储到变量中?

Get-Job | Receive-Job | sort RemoteAddress | FT

我已经尝试过了,但它并没有像我想象的那样工作:

$pcs = Get-Job | Receive-Job | sort RemoteAddress | FT
$pcs.RemoteAddress

我是不是走错了路?我想存储来自上面get-job 命令的数据,以便稍后在脚本中使用这些值。我认为它会起作用,因为输出看起来正确: 命令:

Get-Job | Receive-Job | sort RemoteAddress | FT

输出:

RemoteAddress PingSucceeded                        
------------- -------------                         
192.168.0.163          True
192.168.0.101          False
192.168.0.2            False
192.168.0.251          True 

【问题讨论】:

  • 简单删除FT。格式表不用于存储数据。只是在控制台上查看。格式 cmdlet 会破坏对象,因此您不能再以预期的方式使用它们。我将为此做一个更长的答案以供将来参考。

标签: powershell


【解决方案1】:

Format-cmdlet 的问题

这里的问题是您使用了FT,它是Format-Table 的别名。这些Format- cmdlet 专为控制台/屏幕输出而设计。你可以用它们做很多事情来定制输出,但在每种情况下,PowerShell 都需要处理数据才能做到这一点。这包括将传递的对象分解为不同对象的组...

Microsoft.PowerShell.Commands.Internal.Format.FormatEndData
Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData
Microsoft.PowerShell.Commands.Internal.Format.FormatStartData
Microsoft.PowerShell.Commands.Internal.Format.GroupEndData
Microsoft.PowerShell.Commands.Internal.Format.GroupStartData

以上数据类型是从运行此代码中提取的。

Get-ChildItem c:\temp | Format-Table | Get-Member

因此,您不再拥有通常从 Get-ChildItem 获得的 System.IO.FileInfoSystem.IO.DirectoryInfo 对象

另一个大问题来自 Format-cmdlet 对截断数据的性质,例如具有大量元素或长字符串的数组,以使其尽可能适合屏幕。在数组的情况下,这是由于偏好变量$FormatEnumerationLimit 通常默认为 4。

Ten Numbers                                                                                                                                                  
-----------                                                                                                                                                  
{1, 2, 3, 4...}  

这些和其他限制都可以通过 -AutoSize-HideTableHeadersout-string -width 等 cmdlet 开关来缓解。但这并不重要,因为...


解决方案

好消息是解决方案非常简单。停止将它们用于控制台输出以外的任何内容。使用我之前的示例:

  • 将结果保存到变量中?$result = Get-ChildItem C:\temp

  • 导出数据Get-ChildItem C:\temp | Export-CSV $path -NoTypeInformation。其他Export-cmdlet 可以在这里首选,例如Export-CLIXml,当您想将复杂对象存储在其他地方使用时。如果您只是想在输出中包含一些漂亮的东西,那么请考虑使用ConvertTo-HTML

  • 提取单个属性?:只需使用Select-Object$result | Select prop1, prop2。您还可以扩展您的属性选择以仅使用 -ExpandProperty 获取字符串或字符串数​​组:$result | Select -ExpandProperty prop1

  • 使用上述属性执行内联计算?Use calculated expression,就像使用 Format-Cmdlet 一样。 $result | Select prop1, @{Name="prop2";Expression={$_.prop2 * 3}


可能的可接受用途

有些人更喜欢将输出用于电子邮件和记录统计信息。虽然将数据保存为更易于使用的格式以供以后使用是不可或缺的。但是,如果您真的需要这些数据,请记住,您不再使用您原来拥有的对象。

因此,如果您需要表格格式的数据但存储为字符串,请考虑Out-String

$body = Get-ChildItem c:\temp | Format-Table | Out-String

但请记住,Format-Table 将使用对象输出以使其显示在屏幕上(截断的数组属性和长字符串)。真的..如果你想要它漂亮和格式化,那么你应该使用ConvertTo-HTML

重点是您几乎不需要保留 Format-Table 中的数据。几乎总有更好的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 2020-04-07
    相关资源
    最近更新 更多