【问题标题】:xml node exists using variables in powershellxml节点在powershell中使用变量存在
【发布时间】:2015-02-19 17:03:42
【问题描述】:

我正在尝试确定我的 powershell 脚本中是否存在具有特定 DisplayName 的邮箱(请参阅下面的示例 xml)。如果我对值进行硬编码,我可以找到节点,但我无法将此值作为参数传递。我尝试了各种转义方式,使用单引号和双引号,但没有一个是正确的。

如果不存在具有相同 DisplayName 的邮箱节点,则最终目标是创建邮箱节点。可能有 0 个或多个 Mailbox 节点。

这是一个示例 xml:

<Profiler>
  <Mailboxes>
    <Mailbox>
      <DisplayName>django</DisplayName>
    </Mailbox>
  </Mailboxes>
</Profiler>

这是一段代码,如果节点不存在,我想执行:

$newMailbox = $xmlData.CreateElement("Mailbox")
$newDisplayName = $xmlData.CreateElement("DisplayName")
$newDisplayNameText = $xmlData.CreateTextNode($mailboxName)
$newDisplayName.AppendChild($newDisplayNameText)
$newMailbox.AppendChild($newDisplayName)
$mailboxes = $xmlData.SelectSingleNode("./Profiler/Mailboxes")
$mailboxes.AppendChild($newMailbox)

这段代码有效:

$users = $xmlData.SelectNodes("./Profiler/Mailboxes/Mailbox/DisplayName[text() = 'django']")
write-host $users.count

脚本输出:1

这不是:

$mailboxName = "django"
$users = $xmlData.SelectNodes("./Profiler/Mailboxes/Mailbox/DisplayName[text() = $mailboxName]")
write-host $users.count 

脚本输出:0

我也试过这个:

$mailboxName = "django"
$users= $xmlData.SelectNodes("./Profiler/Mailboxes/Mailbox[DisplayName = $mailbox]")

脚本的输出:使用“1”参数调用“SelectNodes”的异常:“表达式必须计算为节点集。”

【问题讨论】:

    标签: xml powershell xpath


    【解决方案1】:

    我想你想要$users = $xmlData.SelectNodes("./Profiler/Mailboxes/Mailbox/DisplayName[. = '$mailbox']")

    【讨论】:

    • 根据ss64.com/ps/syntax-esc.html 和我所见,它不起作用 - 单引号字符串中的任何内容都不会被评估。如果我尝试双引号,我会得到新的错误
    • 据我了解,我的代码示例中的 powershell 字符串由双引号分隔,因此 powershell 将进行变量插值。单引号在双引号字符串中,它们在 XPath 中,因此传递给SelectNodes 的参数将是字符串./Profiler/Mailboxes/Mailbox/DisplayName[. = 'jango'] 而不是字符串./Profiler/Mailboxes/Mailbox/DisplayName[. = jango],因为后者会将DisplayName 与一个名为 jango 的 XML 元素,而不是字符串值 jango
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2020-02-04
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2022-11-16
    相关资源
    最近更新 更多