Contains()和Replace()在控制台中工作,但在运行脚本时不工作

时间:2017-12-18 11:09:42

标签: powershell

我有一个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>

1 个答案:

答案 0 :(得分:0)

嗯,这并没有完全回答正在发生的事情,因为我不完全理解在读取和写入文件与执行脚本时,字符编码在Powershell中是如何工作的。

然而,问题是当读取输入文件时,井号在字符串中变为双字节字符('£')。替换功能无法将'£'与'£'匹配,并且替换失败。 我不能提供真正的解决方案,但为此解决方法。使用-replace运算符而不是.Replace函数,因为-replace可以处理正则表达式。

以下行有效:

($excelXml -replace '(Fee Due: +.)', "`$1|$($feeInfo[0])").Replace('|', '')

拥有'|'的原因在这里,我无法弄清楚如何使$1$($feeInfo[0])序列工作。 $1后跟$在双引号字符串中不起作用。