我是批处理脚本的新手。我想替换特定文件中的字符串。 在下面的脚本中,我收到了错误。
@echo off
$standalone = Get-Content 'C:\wildfly\standalone\configuration\standalone.xml'
$standalone -replace '<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>','<wsdl-host>${jboss.bind.address:0.0.0.0}</wsdl-host>' |
Set-Content 'C:\wildfly\standalone\configuration\standalone.xml'
答案 0 :(得分:1)
编辑XML的正确方法是将其作为XML文档处理,而不是作为字符串处理。这是因为XML文件无法保证保持特定的格式。任何编辑都应该是上下文感知的,并且字符串替换不是。考虑三个eqvivalent XML片段:
<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>
<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host >
<wsdl-host >${jboss.bind.address:127.0.0.1}</wsdl-host >
请注意,元素名称中的whitespacing不同,it's legal添加一些。更重要的是,在实践中,许多实现只是丢弃元素值中的换行符,因此以下两个可能会为配置解析器提供相同的结果:
<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>
<wsdl-host>${jboss.bind.address:127.0.0.1}
</wsdl-host>
将XML作为字符串处理真的没有多大意义,是吗?
幸运的是,Powershell内置了对XML文件的支持。一个简单的方法就是这样,
# Mock XML config
[xml]$x = @'
<root>
<wsdl-host>${jboss.bind.address:127.0.0.1}</wsdl-host>
</root>
'@
# Let's change the wsdl-host element's contents
$x.root.'wsdl-host' = '${jboss.bind.address:0.0.0.0}'
# Save the modified document to console to see the change
$x.save([console]::out)
<?xml version="1.0" encoding="ibm850"?>
<root>
<wsdl-host>${jboss.bind.address:0.0.0.0}</wsdl-host>
</root>
如果您无法使用Powershell并且无法使用批处理脚本,那么您确实需要使用第三方XML操作程序。