我对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 }
}
}
答案 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
只是一个想要帮助的业余爱好者,希望这是在正确的轨道上。