Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 我在PowerShell代码中遇到问题,该代码不';无法在v2中正常运行_Xml_Powershell 2.0 - Fatal编程技术网

Xml 我在PowerShell代码中遇到问题,该代码不';无法在v2中正常运行

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.

我们正在尝试在一个任务序列内更新BIOS,我有一个由联想提供的脚本,它在Windows10和PowerShell v5中运行良好。但是,它在装有PowerShell v2的Windows7中无法正常工作。我们无法在Windows7计算机上升级到v5

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

所以脚本看起来像:

[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)
    }
    

非常感谢您抽出时间!