如何存储Format-Table的输出以备后用

我有一个脚本,创build几个作业,并在作业中存储两个简单的值。

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

这工作正常。 我想知道的是如何将以下代码存储到variables中?

 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 

问题与Format-cmdlet

这里的问题是你使用FTFormat-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 

上面的数据types是从运行这个代码中提取的。

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

因此,您不再具有您通常从Get-ChildItemSystem.IO.FileInfoSystem.IO.DirectoryInfo对象

另一个大问题来自于Format-cmdlet自然截断数据,比如包含大量元素或长string的数组,以使屏幕更加合适。 在数组的情况下,这是由于首选variables$FormatEnumerationLimit通常默认为4。

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

这些和其他限制都可以通过像-AutoSize-HideTableHeaders这样的cmdlet开关, out-string -width -HideTableHeaders等等来缓解。然而这并不重要,因为…


好消息是解决scheme非常简单。 停止使用他们除了控制台输出之外的任何东西 使用我之前的例子:

  • 保存结果在一个variables?$result = Get-ChildItem C:\temp
  • 导出数据Get-ChildItem C:\temp | Export-CSV $path -NoTypeInformation Get-ChildItem C:\temp | Export-CSV $path -NoTypeInformation 。 其他Export-CLIXml cmdlet可能在此处比较喜欢Export-CLIXml ,因为如果要将其存储在其他位置,则可以使用复杂对象。 如果你只是在你的输出中寻找可以包含的东西,那就考虑ConvertTo-HTML

  • 提取各个属性? :只要使用Select-Object$result | Select prop1, prop2 $result | Select prop1, prop2 。 您还可以扩展您的属性select,只需使用-ExpandProperty$result | Select -ExpandProperty prop1来获取string或string数​​组 $result | Select -ExpandProperty prop1

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

潜在的可接受使用

有些人喜欢输出用于电子邮件和logging统计。 尽pipe将数据保存为更易于使用的格式以供日后使用是不可或缺的。 但是,如果你真的需要这些数据,请记住,你没有使用原来的对象。

所以,如果你需要表格格式的数据,但以stringforms存储,那么考虑Out-String

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

但要记住, Format-Table将使用对象输出进行播放,以便将其显示在屏幕上(截断的数组属性和长string)。 真的..如果你想它很好,格式化,那么你应该只使用ConvertTo-HTML

点是你几乎从不需要保留格式表的数据。 几乎总是有一个更好的方法。