2010-02-05 64 views
6

我想用。powershell替換.config文件中的一個句子。傳遞字符串包括美元符號 - 更換變量

${c:Web.config} = ${c:Web.config} -replace 

'$BASE_PATH $ \測試\ bin` $ Test_TYPE` $ \ WebTest.dll', 'C:\ PROGRAM FILES \例子\ webtest.dll'

每次我試圖運行上面的代碼我得到

「無效的正則表達式模式: $ BASE_PATH $ \測試\ BIN \ $ Test_TYPE $ \ WebTest.dll」 在C:\測試\ runtesting.ps1 -replace < < < < $ BASE_PATH $ \測試\ BIN \ $ Test_TYPE $ \ WebTest.dll

如果我不使用反引號的美元符號將消失,一些文字。

如何將字符串中的美元符號傳遞給 - 替換?

+0

在我的答案中添加了代碼。 – stej 2010-02-05 12:28:19

回答

5

這是如何逃脫正則表達式。每一個特殊字符(特殊至於正則表達式),如$\

'$A$B()[].?etc' -replace '\$|\(|\)|\[|\]|\.|\?','x' 
'$BASE_PATH$\Test\bin$Test_TYPE$\WebTest.dll' -replace '\$BASE_PATH\$\\Test\\bin\$Test_TYPE\$\\WebTest.dll','something' 

轉義倒引號將被使用時,正則表達式將是這樣的:

'$A$B' -replace "\`$",'x' 
+0

當我嘗試你的例子,它完美的工作,但是當我試着對我的代碼如下,沒有運氣。 1)\\ BASE_PATH \ $ \ Test \ bin \\ $ Test_TYPE \ $ \ WebTest.dll','c:\ program files \ example \ webtest.dll' $ \ Test \ bin \\'$ Test_TYPE \'$ \ WebTest.dll「,'c:\ program files \ example \ webtest.dll' – 2010-02-05 11:38:46

+0

在提交我的評論之前,第二個選項在反向後有反斜槓......但現在他們沒有顯示。 – 2010-02-05 11:41:26

+0

嘗試以下操作後,在現有的反斜槓之前添加一個美元符號和另一個反斜槓之前添加(斜槓+反向符號),打開並用雙引號關閉該字符串... -replace「\'$ BASE_PATH \'$ \ \ Test \\ bin \\'$ Test_TYPE \'$ \\ WebTest.dll「 – 2010-02-05 11:47:38

3

經過:

$BASE_PATH$\Test\bin\$Test_TYPE$\WebTest.dll 

更改爲:

`"\`$BASE_PATH\`$\\Test\\bin\\\`$Test_TYPE\`$\\WebTest.dll"` 

邏輯:

  • 每一個美元符號之前輸入\`
  • 每一個反斜槓之前進入另一個反斜線\
  • 關閉字符串用雙引號 「」
+0

這使我的投票得票,因爲它提供了最簡單和最簡明的問題解釋。 – 2016-01-31 16:11:45

1

只是提供一個有點背景stej's answer,有兩件事情會在這裏:

1)解析命令時,PowerShell在-replace的字符串參數中爲expanding the variables(例如,字符串"shell: $ShellId"將擴展ShellId變量,生成shell: Microsoft.PowerShell)。使用反引號轉義字符或用單引號聲明該字符串可防止此問題("shell: `$ShellId"'shell: $ShellId'變爲shell: $ShellId)。

2)-replace操作者使用.NET regular expressions,其中$\,和.字符是特殊的語言元素。使用反斜槓轉義字符可將特殊字符視爲正則表達式內的文字值(例如,\$將匹配美元字符,而$將與該行的末尾匹配)。既然$被powershell和正則表達式使用,它必須被轉義兩次(使用"\`$"'\$')。

在這種情況下,另一種替代方案是使用string.Replace方法,該方法將執行一個區分大小寫的替換:

${c:Web.config}.Replace(
    '$BASE_PATH$\Test\bin$Test_TYPE$\WebTest.dll', 
    'c:\program Files\example\webtest.dll' 
) 
1

對於那些不熟悉的區別,不要混淆反引號是很重要(`)單引號字符(')在這些逃生。例如:

[SUCCESS]雙引號作爲容器反斜槓反引號爲轉義:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\`$old", "(New)"} 
What is (New)? 
PS C:\Temp> 

[FAIL]雙引號作爲容器反斜槓撇號如逃逸:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\'$old", "(New)"} 
What is $old? 
PS C:\Temp> 

[成功]單引號作爲容器,簡單反斜槓作爲轉義:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\$old', "(New)"} 
What is (New)? 
PS C:\Temp> 

[FAIL]單引號作爲容器反斜槓反引號爲轉義:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\`$old', "(New)"} 
What is $old? 
PS C:\Temp> 

總體而言,最簡單的選項可以是使用單引號作爲容器和一個反斜槓作爲轉義:'\$old'