如何存储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
这里的问题是你使用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
上面的数据types是从运行这个代码中提取的。
Get-ChildItem c:\temp | Format-Table | Get-Member
因此,您不再具有您通常从Get-ChildItem
的System.IO.FileInfo
和System.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
。
点是你几乎从不需要保留格式表的数据。 几乎总是有一个更好的方法。