Xml 我在PowerShell代码中遇到问题,该代码不';无法在v2中正常运行
我们正在尝试在一个任务序列内更新BIOS,我有一个由联想提供的脚本,它在Windows10和PowerShell v5中运行良好。但是,它在装有PowerShell v2的Windows7中无法正常工作。我们无法在Windows7计算机上升级到v5 该脚本读取我从SCCM导出的XML文件,并匹配相应的BIOS包,下载并运行它 所以脚本看起来像:Xml 我在PowerShell代码中遇到问题,该代码不';无法在v2中正常运行,xml,powershell-2.0,Xml,Powershell 2.0,我们正在尝试在一个任务序列内更新BIOS,我有一个由联想提供的脚本,它在Windows10和PowerShell v5中运行良好。但是,它在装有PowerShell v2的Windows7中无法正常工作。我们无法在Windows7计算机上升级到v5 该脚本读取我从SCCM导出的XML文件,并匹配相应的BIOS包,下载并运行它 所以脚本看起来像: [xml]$Packages=获取内容BIOSPackages.xml #仅对任务序列调用环境变量 $tsenv=新对象-com对象Microsoft.
[xml]$Packages=获取内容BIOSPackages.xml
#仅对任务序列调用环境变量
$tsenv=新对象-com对象Microsoft.SMS.TSEnvironment
$BIOS=(获取WmiObject-命名空间根目录\cimv2-类Win32\U BIOS).SMBIOSBIOSVersion.Substring(0,4)
$ns=新对象Xml.XmlNamespaceManager$Packages.NameTable
$ns.AddNamespace(“def”http://schemas.microsoft.com/powershell/2004/04")
$Xpathqry=“/def:Objs/def:Obj//def:MS[包含(,`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
方法调用失败,因为[System.Xml.XPathNodeList]不包含
名为“SelectNodes”的方法。
在C:\\U SMSTaskSequence\Packages\NC1002CB\Get BIOSPackages.ps1:17 char:38
+$PackageID=$Package.SelectNodes错误消息实际上非常清楚
$Packages.SelectNodes()
返回一个集合。在随后的语句中,当集合没有此类方法时,您试图调用该集合上的方法SelectNodes()
。这就是导致错误的原因
该代码在PowerShell v5中工作的原因是Microsoft引入了一个名为with PowerShell v3的新功能,该功能自动将对集合的非现有成员(属性和方法)的调用传递到集合的元素。在您的情况下,由于集合$Package
没有方法SelectNodes()
,因此调用$Package.SelectNodes()
解决这个问题有多种方法,例如:
- 到Windows7计算机上的v3或更高版本。是的,我看到你说你不能升级Windows7机器,但事实上这是首选的解决方案
- 将
$Packages.SelectNodes()
的结果限制为一项:
$Package = $Packages.SelectNodes($xpathqry, $ns) |
Select-Object -First 1
- 仅在下一语句中使用
$Packages
的第一个元素:
$PackageID = $Package[0].SelectNodes('def:S[contains(@N,"PackageID")]',$ns)
- 为
$Package
的每个元素调用SelectNodes()
:
$PackageID = $Package | ForEach-Obejct {
$_.SelectNodes('def:S[contains(@N,"PackageID")]',$ns)
}
非常感谢您抽出时间!