我正在尝试编写一个PowerShell脚本来比较两个变量,一个包含当前正在运行的服务列表,另一个包含应该查看差异的预定义列表.我想显示差异,同时还显示当前正在运行的服务.
$compared = Compare-Object $spServices $spServices23 -SyncWindow 0 Write-Output $compared if($sTask -eq "Read") { foreach ($spService in $spServices) { $out = new-object psobject $out | add-member noteproperty TypeName $spService.TypeName $out | add-member noteproperty Status $spService.Status Write-Output $out } }
但是,当我输出Compare-Object结果时,它会显示它们,但是对于$ out变量的输出,它会变为空白.任何帮助我如何做到这一点,同时保持输出格式化.
PowerShell始终尽力确保将输出转换为最有用的格式.其中一种方法是通过查看它首先在函数中显示的对象类型,并确保所有未来对象也匹配此格式.有时它是可能的,有时它不是.
对于代码,PowerShell会执行,然后尝试发出结果Compare-Object
并成功.'Compare-Object'发出具有这些属性的对象.
Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() InputObject NoteProperty System.ServiceProcess.ServiceController InputObject=AdobeARMservice SideIndicator NoteProperty string SideIndicator==>
除非你做了一些花哨的技巧,否则这些属性为这个命令中可以发出的内容设置了阶段.您没有看到后续命令的输出的原因是它们也不输出相同的属性.
为了说明这个问题,请参阅以下代码:
function Ham2{ [pscustomobject]@{Name='FoxDeploy';Job="Coder"} [pscustomobject]@{Name='Ham';Profession="Coder"} }
执行此操作时,发出的FIRST对象的属性将确定稍后在代码中显示的内容.例如:
>ham2 Name Job ---- --- FoxDeploy Coder Ham
解决这个问题
有几种方法可以解决这个问题.
首先,PowerShell最佳实践是您的脚本应该只发出一种类型的对象.这就是函数.OUTPUT
在其帮助中有一个声明的原因[CmdletBinding()]
,PowerShell期望命令只发出一种类型的对象,可能还有一些-Verbose
或ErrorStream消息.
如果您真的想要发出两种类型的对象,则可以确保第一个对象具有您可能想要显示的所有属性.回到我之前的例子,如果我将Profession
属性添加到第一个对象,现在我的第二个对象的Profession
属性现在将变为可见.
function Ham2{ [pscustomobject]@{Name='FoxDeploy';Job="Coder";Profession=''} [pscustomobject]@{Name='Ham';Profession="Coder"} } PS C:\Users\Stephen> ham2 Name Job Profession ---- --- ---------- FoxDeploy Coder Ham Coder
可能你想要什么,但不推荐
如果你真的想要发出两种或更多种不同类型的物体(你肯定不会这样做,对吧?)那么你可以使用Format-List
或者绕过这个怪癖Format-Table
.请注意:这些将输出转换为文本格式化命令,您将丢失对象属性,人们通常会认为这是一件很麻烦的事情.但它会奏效.
function iFeelIcky{ $spservices = gsv AdobeARMservice,bits $compared = Compare-Object (get-service bits,winrm) $spservices -SyncWindow 0 $compared | Format-Table foreach ($spService in $spServices) { $out = new-object psobject $out | add-member noteproperty DisplayName $spService.DisplayName $out | add-member noteproperty Status $spService.Status $out } } C:\Users\Stephen> iFeelIcky InputObject SideIndicator ----------- ------------- AdobeARMservice => bits <= bits => winrm <= DisplayName Status ----------- ------ Adobe Acrobat Update Service Running Background Intelligent Transfer Service Running }
我希望有所帮助!让我知道,如果你想让我深入潜水或出于某种原因希望我留在这个肥皂盒:-)