如何存储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 -NoTypeInformationGet-ChildItem C:\temp | Export-CSV $path -NoTypeInformation。 其他Export-CLIXmlcmdlet可能在此处比较喜欢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 。 
点是你几乎从不需要保留格式表的数据。 几乎总是有一个更好的方法。