2012-07-06 78 views
1

this發佈,我設法用Windows XP上的Powershell替換目錄的子文件中的字符串。Powershell:無效的正則表達式

foreach ($f in gci -r -include "*.bat") 
    { (gc $f.fullname) | 
     foreach { $_ -replace "D:","C:\path" } | 
     sc $f.fullname 
    } 

不幸的是,一些特殊情況下需要「C:\\」而不是「C:\」。

我試圖使用下面的命令來解決這個問題(替換:用 「C \路徑\\」, 「C:\\路徑\\」),但它未能:

foreach ($f in gci -r -include "*.bat") 
    { (gc $f.fullname) | 
     foreach { $_ -replace "C\path\\","C:\\path\\" } | 
     sc $f.fullname 
    } 

誤差是:

Invalid regular expression pattern: C:\path\\ 

我在努力消除這個問題的嘗試幾種變體,但所有產生相同的誤差(替換上面的行#3):

foreach { $_ -replace "C:\path\\\\","C:\\path\\" } | 
foreach { $_ -replace 'C:\path\\',"C:\\path\\" } | 
foreach { $_ -replace "`C:\path\\","C:\\path\\" } | 
foreach { $_ -replace 'C:\path\\\\',"C:\\path\\" } | 

有什麼想法?

+0

是否缺少了 ':' 由於某種原因,在你的代碼? – 2012-07-06 21:22:17

+0

@Christian:不,對不起,只是一個錯字。 – 2012-07-06 21:25:48

回答

3

對於repalcing替換:用 「C \路徑\」 「C:\\路徑\\」

使用

$_ -replace "c:\\path\\\\","c:\\path\\" 

匹配模式是正則表達式和 '\' 需要被轉義一個'\'。 替換字符串只是一個字符串,不需要轉義字符

+0

當然......我有點太專注於一組錯誤的反斜槓。再次感謝! – 2012-07-06 21:30:41

+0

總是樂於幫忙! – 2012-07-06 21:31:02

+3

對於需要找到文本文本的這些類型的情況,我通常使用'$ escapedSearch = [regex] :: Escape('C:\ path \')來轉義搜索參數。使用'$ escapedSearch'和'-replace'。當文字文本是變量並且可以是任何東西時,這肯定是有用的。 – 2012-07-07 08:29:32

0

只是爲了詳細說明CB所說的,當替換字符串中的「\」時,必須在字符串的「查找」部分中將其轉義。做到這一點的最簡單的方法是如下

$escapedPath = $path -replace "\\","\\" 

或澄清:

$escapedPath = $path -replace [RegEx]"\\",[String]"\\" 

由於-replace第一個參數是一個正則表達式,它把「\」不同,則第二半是一個字符串數據類型。