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

Powershell Contains()和Replace()在控制台中工作,但在运行脚本时不工作,powershell,Powershell,我打开了一个XML文件,并将其存储在带有Get Content的字符串中,我需要执行一系列Replace()操作来填充一些空元素 我将需要替换的子字符串直接从XML文件复制到脚本中,除了一个外,其他所有子字符串都执行替换。在子字符串上使用Contains()也会返回False 如果我使用命令行打开XML文件并尝试执行相同的替换(直接从脚本复制),它将工作并使用Contains()返回True 我原以为这可能是Replace()方法运行的顺序,但我重新安排了顺序,仍然不起作用。我还认为它可能有一些

我打开了一个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])
序列工作
$1
后跟一个
$
在双引号字符串中不起作用。

当Contains()抛出
false
时,我的第一个猜测是在运行脚本时检查变量是否提供了正确的输出,只需在脚本上回显输出并检查它。请提供最小的、可验证的完整示例。否则我们只能猜测。我编辑了这个问题,提供了有关回声输出的更多信息和一些函数示例。请提供您的代码和示例输入。共享XML以及共享代码以更好地理解。感谢您的帮助!我仍然不确定编码错误发生在哪里,但我最终使用了显式unicode for
来代替您的解决方案<代码>$excelXml=$excelXml.Replace(“到期费用:$([char]0x00A3”,“到期费用:$([char]0x00A3)$($feeInfo[0])”)”是的,甚至更好!我的解决方案不是最优雅的:)