使用从 Xml 读取的变量并使用它从另一个带有 Powershell 的 xml 中搜索元素

马里奥·阿纳格诺斯托普洛斯

这是snpdate.xml

<skata serial="GSI100-A-00103"/>

这是 test.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Clients xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <set>
    <indexlist>
        <index name="mario1" sn="GSI100-A-00100" status="ok" version="v49" />
        <index name="mario2" sn="GSI100-A-00101" status="ok" version="v49" />
        <index name="mario3" sn="GSI100-A-00102" status="ok" version="v49" />
        <index name="mario4" sn="GSI100-A-00103" status="OFF" version="v49" />
        <index name="mario5" sn="GSI100-A-00104" status="ok" version="v49" />
        <index name="mario6" sn="GSI100-A-00105" status="ok" version="v49" />
        <index name="mario7" sn="GSI100-A-00106" status="ok" version="v49" />
    </indexlist>
    </set>
    </Clients>

$xmloff = New-Object System.Xml.XmlDocument
$xmlold = "C:\Program Files (x86)\GSI\Atreus\snupdate.xml" 
$xmledit = "C:\Users\bigadmin\Desktop\Projects\AutoUpdate\test.xml"
[xml]$Xmlsn = Get-Content($xmlold) -Encoding UTF8    #open 1st xml
[xml]$Xmlnew = Get-Content($xmledit) -Encoding UTF8  #open 2st xml

$you = $Xmlsn.SelectSingleNode("//skata/@serial") #get value of serial element
$you.Value #prints correct value


$attr = $Xmlnew.SelectSingleNode("//Clients/set/indexlist/index[@sn='$you']/@status")
#from the second xml trying to get the value of status based on sn taking #the variable of $you. returns null.instead of OFF. if i manually insert   
#[@sn='GSI100-A-00103'] instead of "$you" i get the correct result.    

 $attr.Value 

我试图从第二个 xml 中获取基于 sn 的状态值,取$you. 它返回 null 而不是 OK。如果我手动插入
[@sn='GSI100-A-00103']而不是$you我得到正确的结果。我想获取$you带值的变量f.e.GSI100-A-00103并在另一个 xml 上使用它来查找状态 = 关闭的新元素值。我认为问题是该变量是从另一个 xml 加载的?

事物管理

您需要sn与字符串$you.Value而不是 XmlAttribute进行比较$you由于您需要检索带引号的字符串内的属性值,因此$()使用运算符。

$attr = $Xmlnew.SelectSingleNode("//Clients/set/indexlist/index[@sn='$($you.Value)']/@status")

解释:

在字符串中检索对象的属性时,变量扩展会在.字符处停止这些情况需要使用子表达式运算符$()运算符告诉 PowerShell 解析器根据.字符重新评估解析模式,而不是将.propertyname视为文字字符串。

您可以在下面的示例中看到这一点:

$obj = [pscustomobject]@{"Property" = "Value"}
"$obj.property"   # Unexpected Results
@{Property=Value}.property

"$($obj.property)"  # Expected Results
Value

这是微软关于子表达式运算符的页面

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Powershell从多个XML文件中的元素获取数据以输出到另一个单个XML文件

使用powershell将另一个子元素附加到xml

如何使用 PowerShell 从另一个文件更改 XML 中的值?

使用PowerShell从另一个文档的节点值的XML数组中替换一个XML中的XML值

使用 powershell 搜索 XML 属性值

使用另一个 XML 数据在 XML 中搜索

使用 Powershell 在现有 XML 文档中创建新元素

使用LINQ在XML文件中搜索2个不同的元素

使用Powershell编辑xml

Powershell和使用XML

使用 Powershell 解析 xml

如何使用PowerShell获取XML元素?

使用powershell向xml添加新元素

使用PowerShell更改XML元素值

使用Powershell操纵xml文件dom并创建另一个xml文件

使用元素名称中的名称空间更新Xml文件(PowerShell)

使用Groovy XmlParser搜索整个文档中的XML元素

使用XPath从序列中搜索匹配的XML元素

使用PowerShell读取XML节点

使用PowerShell更改XML中的Item(0)

使用 PowerShell 替换嵌套 XML 中的值

使用Java读取XML中另一个节点内的节点

如何使用PowerShell使用XML路径变量读取XML文件中的CDATA?

使用Powershell将XML元素添加到复杂的XML文件中

使用python根据XML中的另一个子元素修改子元素

Powershell - 搜索具有特定名称的元素的 XML 并将它们添加到另一个 XML 文档

使用xml.etree.ElementTree搜索XML元素树的属性

使用 powershell 遍历 XML 文件并将一个字段合并到另一个字段中

使用Powershell编辑XML文件