我有一个XML文件,我打开并存储在Get-Content
的字符串中,我需要执行一系列Replace()
操作来填充一些空元素。
我正在将我需要直接替换的子字符串从XML文件复制到脚本中,除了一个之外的所有子字符串都执行替换。在子串上使用Contains()
也会返回False
。
如果我使用命令行打开XML文件并尝试执行相同的替换,直接从脚本复制,它可以工作并使用Contains()
返回True
。
我认为它可能是Replace()
方法运行的顺序,但我重新安排了顺序,它仍然不起作用。我也认为它可能是一些空格,但我正在替换的每个其他子字符串也都有一些空格。
有什么可能导致这种差异的想法?
编辑:
代码示例:
$sharedStrings = '.\sharedStrings.xml'
$feeInfo = @('100.00', 'Cheque')
$excelXml = Get-Content -Path $sharedStrings -Encoding UTF8
$excelXml = $excelXml.Replace('Fee Due: £', "Fee Due: £$($feeInfo[0])")
$excelXml = $excelXml.Replace('Expected By: Cheque / Card / On-Line', "Expected By: $($feeInfo[1])")
$excelXml | Out-File -Encoding UTF8 ".\output.xml"
输入XML示例:
<t xml:space="preserve">Fee Due: £ Expected By: Cheque / Card / On-Line Paid on: / / </t>
输出XML示例:
<t xml:space="preserve">Fee Due: £ Expected By: Cheque Paid on: / / </t>
好吧,这并没有完全回答正在发生的事情,因为我不完全理解在读取和写入文件与执行脚本时,字符编码在Powershell中的工作原理。
但问题是,当读取输入文件时,井号在字符串中变为双字节字符('£')。替换功能无法将'£'与'£'匹配,并且替换失败。我不能提供真正的解决方案,但为此解决方法。使用-replace运算符而不是.Replace函数,因为-replace可以处理正则表达式。
以下行有效:
($excelXml -replace '(Fee Due: +.)', "`$1|$($feeInfo[0])").Replace('|', '')
有'|'的原因在这里是我无法弄清楚如何让$1$($feeInfo[0])
sequence工作。由$1
执行的$
flowlow用双引号字符串不起作用。