我有一个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'是意外的标记。”
2条答案
按热度按时间qxsslcnc1#
您的XML格式不正确:
&
字符(&stuff=0
),这就是问题的原因:下面的内容被认为是XML entity reference的一部分,并且由于&
* 不是 * 文档中一个的开始,解析 * 中断 *,即当遇到=
时(假定=
不是实体引用名称中的法律的字符)。&
替换为&
--即表示 literal&
的实体引用--问题就解决了:如果无法从源头解决问题,请执行字符串替换(使用简化示例):
注意:这个简单的方法假设你的文档 * 不 * 包含
&
字符,这些字符 * 已经是 * 有效实体引用的一部分。你需要一个更复杂的方法,使用正则表达式来处理这种情况。顺便说一句,重新解析文件中的XML:
-Raw
添加到Get-Content
调用中来加快命令的执行速度,这将使它读取整个文件 * 作为一个整体 *。Get-Content
可能会 * 误解 * 输入文件的字符编码。xv8emn3q2#
示例代码中的最后一行应更改为...
发件人:
收件人:
我已经测试了您发布的示例xml,并得到了错误,通过管道到
ConverTo-Xml
它的工作。