2017-12-18 200 views
-2

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

我編輯了一些關於回聲輸出和函數示例的更多信息。 –

回答

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

相關問題