为PowerShell脚本的结果添加颜色异常

时间:2013-08-28 21:14:43

标签: xml linq powershell

我对Powershell世界相当陌生,并且在解决这个问题时遇到了一些困难。我的代码在下面并且非常简单,与我用其他人做的相比,但是这个代码不起作用,我无法弄清楚我做错了什么。我使用比我下面的简单$ VMToolsList更长,更复杂的“列表”做了几乎完全相同的事情。当我运行下面的代码时,我得到了wsIndex1和2的以下错误。我想知道我错过了什么?

使用“2”参数调用“IndexOf”的异常:“值不能为空。 参数名称:array“ 在C:\ Users \ xxxxxxxxxxx \ AppData \ Local \ Temp \ f2dfef29-9e86-4193-9c37-98b35015e97f.ps1:9 char:2 + $ wsIndex1 = [Array] :: IndexOf($ VMToolsxml.Descendants(“$ {Namespace} th”)。Value,... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo:NotSpecified:(:) [],MethodInvocationException     + FullyQualifiedErrorId:ArgumentNullException

Add-Type -AssemblyName System.Xml.Linq

New-VIProperty -Name ToolsVersion -ObjectType VirtualMachine -ValueFromExtensionProperty 'Config.tools.ToolsVersion' -Force 
New-VIProperty -Name ToolsVersionStatus -ObjectType VirtualMachine -ValueFromExtensionProperty 'Guest.ToolsVersionStatus' -Force
$VMToolsList = $(Get-VM | Select Name, Version, ToolsVersion, ToolsVersionStatus)

$VMToolsxml = [System.Xml.Linq.XDocument]::Parse( "$($VMToolsList | ConvertTo-Html)" )

$wsIndex1 = [Array]::IndexOf( $VMToolsxml.Descendants("${Namespace}th").Value, "Version")
$wsIndex2 = [Array]::IndexOf( $VMToolsxml.Descendants("${Namespace}th").Value, "ToolsVersionStatus")

foreach($row in $VMToolsxml.Descendants("${Namespace}tr")){
    switch(@($row.Descendants("${Namespace}td"))[$wsIndex1]) {
       {"v7" -eq $_.Value } { $_.SetAttributeValue( "style", "background: green;"); continue } 
       {"v7" -ne $_.Value } { $_.SetAttributeValue( "style", "background: red; font color: black"); continue } 
    }
    switch(@($row.Descendants("${Namespace}td"))[$wsIndex2]) {
       {"guestToolsCurrent" -eq $_.Value } { $_.SetAttributeValue( "style", "background: green;"); continue } 
       {"guestToolsNeedUpgrade" -eq $_.Value } { $_.SetAttributeValue( "style", "background: yellow; font color: black"); continue }
       {"guestToolsNotInstalled" -eq $_.Value } { $_.SetAttributeValue( "style", "background: red; font color: black"); continue }
       {"guestToolsUnmanaged" -eq $_.Value } { $_.SetAttributeValue( "style", "background: purple;"); continue }
    }
}

2 个答案:

答案 0 :(得分:1)

首先调试$VMToolsxml.Descendants("${Namespace}th").Value导致null的原因。 BTW XLinq和PowerShell不能很好地协同工作。 Descendants是PowerShell不自动支持的扩展方法。您可以这样使用扩展方法:

[System.Xml.Linq.Extensions]::Descendants($VMToolsxml, "${Namespace}th")

我会考虑使用PowerShell对System.Xml.XmlDocument的支持,并使用带有XPath查询的Select-Xml来查找节点。

答案 1 :(得分:0)

在第9行中,您使用的是 XContainer.Descendants方法(XName)。此方法返回 IEnumerable接口,它似乎不支持.Value方法,这就是我怀疑它返回null的原因。

http://msdn.microsoft.com/en-us/library/bb360635.aspx

http://msdn.microsoft.com/en-us/library/9eekhta0.aspx

只是一个想要帮助的业余爱好者,希望这是在正确的轨道上。