2016-11-18 240 views
9

我想讀取使用PowerShell替換配置文件中的一行。有時候這個腳本可以工作,但大多數時候它並不能取代這條線。如何使用PowerShell替換文件中的某一行?

(Get-Content D:\home\App_Config\Sitecore.config) ` 
    | %{ $_ -replace ' <setting name="Media.MediaLinkServerUrl" value=" "/>',' <setting name="Media.MediaLinkServerUrl" value="https://newurl.com"/>'} ` 
    | Set-Content D:\home\App_Config\Sitecore.config 

回答

6

嘗試以下操作:

$file = 'D:\home\App_Config\Sitecore.config' 
$regex = '(?<=<setting name="Media\.MediaLinkServerUrl" value=")[^"]*' 
(Get-Content $file) -replace $regex, 'https://newurl.com' | Set-Content $file 

Set-Content的說明:默認情況下它使用系統的舊的單字節字符編碼,因此您可能想要使用-Encoding明確控制輸出文件的編碼。
還請注意所需的(...)圍繞Get-Content調用,以確保管道可以回寫到Get-Content已讀取的文件。

由於使用正則表達式來匹配您的現有設置,任何目前內部value="..."文本匹配,如此反覆運行此命令時,會甚至工作。

你的命令中使用的有效文字... value=" ")來查找替換,和之後的第一次 - 成功 - 運行,即字面不再匹配,和後續運行失敗。

@neha自從在每次運行之前聲明值爲手動重置,因此問題中代碼間歇性故障的原因仍然未知。但是,這裏介紹的解決方案似乎工作。

上面的命令使用一個簡化的方法來替代:

  • (?<=<setting name="Media.MediaLinkServerUrl" value=")是向後看斷言((?<=...))匹配,但沒有抓住它匹配的:它找到的部分達幷包括您想要替換的值的開頭",而不會將該前綴部分替換爲所要替換的內容。

  • [^"]*然後匹配整個值,直到但不包括關閉"。 ([^"]是比"任何字符其他^)相匹配的字符集,並且*發現這樣的字符的任何(可能是空的)序列。

  • 因此,由於正則表達式捕獲僅值本身,所有你需要指定的替換字符串是新值。

9

使用替換操作是這樣的:

$file = 'D:\home\App_Config\Sitecore.config' 
$find = ' <setting name="Media.MediaLinkServerUrl" value=" "/>' 
$replace = ' <setting name="Media.MediaLinkServerUrl" value="https://newurl.com"/>' 

(Get-Content $file).replace($find, $replace) | Set-Content $file 
+0

不好意思,找出關鍵字? –

+0

很抱歉的打字錯誤。可能是我寫的所有在一行,這就是爲什麼它是工作間歇。 – neha

+0

' .Replace()'是.NET類型'[string]'的_method_,而不是一個_operator_。與PowerShell使用正則表達式的'-replace'運算符不同,'.Replace()'執行_literal_子字符串替換,我懷疑這可能是neha的問題:在初始(成功)運行腳本之後,文本不再匹配。 – mklement0

相關問題