我在使用在v2中无法正常运行的PowerShell代码时遇到问题

问题描述 投票:0回答:1

我们正在尝试在任务序列中更新我们的BIOS,并且我有一个由Lenovo提供的脚本,它在Windows 10和PowerShell v5中运行良好。但是,在使用PowerShell v2的Windows 7中,它无法正常工作。我们无法在Windows 7计算机上升级到v5。

该脚本读取我从SCCM导出的XML文件,并匹配相应的BIOS包,下载并运行它。

所以脚本看起来像:

[xml]$Packages = Get-Content BIOSPackages.xml

# Environment variable call for task sequence only
$tsenv = New-Object -ComObject Microsoft.SMS.TSEnvironment

$BIOS = (Get-WmiObject -Namespace root\cimv2 -Class Win32_BIOS).SMBIOSBIOSVersion.Substring(0,4)

$ns = New-Object Xml.XmlNamespaceManager $Packages.NameTable
$ns.AddNamespace("def", "http://schemas.microsoft.com/powershell/2004/04")

$Xpathqry = "/def:Objs/def:Obj//def:MS[contains(.,`"$BIOS`")]"

$Package = ($Packages.SelectNodes($xpathqry,$ns))
$PackageID = $Package.SelectNodes('def:S[contains(@N,"PackageID")]',$ns)
$tsenv.Value('OSDDownloadDownloadPackages') = $PackageID.InnerXML

它失败了:

$PackageID = $Package.SelectNodes('def:S[contains(@N,"PackageID")]',$ns)

我试着用它捏一天,我只是碰壁了。

我得到的是以下错误:

Method invocation failed because [System.Xml.XPathNodeList] doesn't contain a
method named 'SelectNodes'.
At C:\_SMSTaskSequence\Packages\NC1002CB\Get-BIOSPackages.ps1:17 char:38
+ $PackageID = $Package.SelectNodes <<<< ('def:S[contains(@N,"PackageID")]',$ns)
    + CategoryInfo          : InvalidOperation: (SelectNodes:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
xml powershell-v2.0
1个回答
1
投票

错误信息实际上非常清楚。 $Packages.SelectNodes()返回XPathNodeList系列。在后续声明中,当集合没有这样的方法时,你试图在该集合上调用方法SelectNodes()。这是造成错误的原因。

代码在PowerShell v5中运行的原因是Microsoft引入了一个名为"member enumeration"的新功能,其中包含PowerShell v3,可以自动将对集合的非现有成员(属性和方法)的调用传递给集合的元素。在你的情况下,由于集合$Package没有方法SelectNodes(),调用$Package.SelectNodes()将在PowerShell v2和更旧版本中抛出错误,并在PowerShell v3及更新版本中调用SelectNodes()$package的元素。

有多种方法可以解决这个问题,例如:

  • 在Windows 7计算机上Update PowerShell到v3或更新版本。是的,我看到你说你无法升级Windows 7机器,但这实际上是首选的解决方案。
  • $Packages.SelectNodes()的结果限制为一个项目: $Package = $Packages.SelectNodes($xpathqry, $ns) | Select-Object -First 1
  • 在下一个语句中使用onle qazxsw poi的第一个元素: qazxsw poi
  • $Packages的每个元素调用$PackageID = $Package[0].SelectNodes('def:S[contains(@N,"PackageID")]',$ns) SelectNodes()
© www.soinside.com 2019 - 2024. All rights reserved.