powershell 如何在XML中使用=符号?

hi3rlvi2  于 2023-01-05  发布在  Shell
关注(0)|答案(2)|浏览(125)

我有一个Powershell脚本,它调用XML,获取一个URL,并试图打开Chrome到那个URL。缺点是,URL包含=字符,而且我见过的字符转义建议都不起作用。
下面是XML:

<Config>
    <Stuff>
        <Application Name="Place" CaptivePortal="https://website.com:1337/php/uid.php?thing=1&stuff=0" RDP="192.168.1.1" Entitlement="Admin" />
    </Stuff>
</Config>

下面是PS脚本中调用它的部分:

Function func_launch_Stuff($v_func_parm_launch_type, $v_func_parm_launch_element){

    # launch based on type
    switch ($v_func_parm_launch_type)
    {
        "URL" {
            $v_Application_Launch = "C:\Program Files\Google\Chrome\Application\chrome.exe"
            $v_Application_Argument = "$($v_func_parm_launch_element)"
            Start-Process -FilePath $v_Application_Launch -ArgumentList $v_Application_Argument -Wait}
}
}

[xml]$v_XML_Config_File = Get-Content -Path $v_parm_XML_Config_File

我已经删除了其他部分,因为这是唯一一个抛出错误。我会去改变原来的脚本更多,但它是手工制作的工程师,我们已经没有了,我不够好与PS重做自己的方式,将处理我的问题,而不使10多。
我尝试使用here中的四个选项,并手动将=字符替换为**=。它总是抛出下面的错误,将X**替换为=、'=或&。
“错误消息:无法将值“System.Object []”转换为类型“System.Xml.XmlDocument”。错误:"'X'是意外的标记。”

qxsslcnc

qxsslcnc1#

您的XML格式不正确:

  • 它包含一个 * unescape * &字符(&stuff=0),这就是问题的原因:下面的内容被认为是XML entity reference的一部分,并且由于& * 不是 * 文档中一个的开始,解析 * 中断 *,即当遇到=时(假定=不是实体引用名称中的法律的字符)。
  • &替换为&amp;--即表示 literal&的实体引用--问题就解决了:
# OK, because "&" was escaped as "&amp;"
[xml] @'
<Config>
    <Stuff>
        <Application Name="Place" CaptivePortal="https://website.com:1337/php/uid.php?thing=1&amp;stuff=0" RDP="192.168.1.1" Entitlement="Admin" />
    </Stuff>
</Config>
'@

如果无法从源头解决问题,请执行字符串替换(使用简化示例):

# Replace '&' with '&amp;' before casting to [xml]
[xml] (@'
  <Config>
    <Foo Url="https://example.org?foo&bar"/>
  </Config>
'@).Replace('&', '&amp;')

注意:这个简单的方法假设你的文档 * 不 * 包含&字符,这些字符 * 已经是 * 有效实体引用的一部分。你需要一个更复杂的方法,使用正则表达式来处理这种情况。
顺便说一句,重新解析文件中的XML

[xml]$v_XML_Config_File = Get-Content -Path $v_parm_XML_Config_File
  • 您可以通过将-Raw添加到Get-Content调用中来加快命令的执行速度,这将使它读取整个文件 * 作为一个整体 *。
  • 然而,这种方便的方法 * 并不完全健壮 *,因为Get-Content可能会 * 误解 * 输入文件的字符编码。
  • 一个完全可靠(但不太方便)的解决方案是:
($v_XML_Config_File = [xml]::new()).Load((Convert-Path $v_parm_XML_Config_File))
  • 有关详细信息,请参见this answer的底部部分。
xv8emn3q

xv8emn3q2#

示例代码中的最后一行应更改为...
发件人:

[xml]$v_XML_Config_File = Get-Content -Path $v_parm_XML_Config_File

收件人:

[xml]$v_XML_Config_File = Get-Content -Path $v_parm_XML_Config_File | ConvertTo-Xml

我已经测试了您发布的示例xml,并得到了错误,通过管道到ConverTo-Xml它的工作。

相关问题