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

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

问题描述:

我有一个XML文件,我打开并存储在一个字符串中,其中Get-Content需要执行一系列Replace()操作来填充一些空的元素。Contains()和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> 
+0

当Contains()抛出'false'时,我的第一个猜测是在运行脚本时检查变量是否提供了正确的输出,只需在脚本上输出并检查它即可。 – Paxz

+1

请提供最小的,可验证的完整示例。否则,我们只能猜测。 –

+0

我编辑了一些关于回声输出和函数示例的更多信息。 –

好了,这不完全回答正在发生的事情nce我并不完全理解字符编码如何在Powershell中读写文件与执行脚本时起作用。

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

下面这行工作:

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

之所以具有 '|'在这里是我不知道如何获得$1$($feeInfo[0])序列的工作。 $1后跟$在双引号字符串中不起作用。

+0

感谢您的帮助!我仍然不确定编码错误发生在哪里,但是我最终使用了显式的Unicode代替解决方案。 '$ excelXml = $ excelXml。替换(“费用到期:$([char] 0x00A3”,“费用到期:$([char] 0x00A3)$($ feeInfo [0])”) –

+0

是的,更好!我的解决方案并不是最优雅的:) – Ingemar