1

这篇文章中,我设法在 Windows XP 上用 Powershell 替换了目录子文件中的字符串。

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

不幸的是,一些例外情况需要“C:\\”而不是“C:\”。

我尝试使用以下命令来解决此问题(将“C:\path\\”替换为“C:\\path\\”),但它失败了:

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\\" } |

有什么想法吗?

4

3 回答 3

3

用“C:\\path\\”替换“C:\path\”

采用

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

匹配模式是正则表达式,“\”需要用“\”转义。替换字符串只是一个字符串,不需要转义字符

于 2012-07-06T21:27:17.220 回答
1

或者,您可以使用字符串类的 Replace() 方法

PS> $folder = "C:\FolderName\NextFolder\ThirdFolder"
PS> $newfolder = $folder.Replace("C:\FolderName\", "D:\")
PS> $newfolder
D:\NextFolder\ThirdFolder
于 2017-06-01T02:19:04.543 回答
0

只是为了详细说明 CB 所说的内容,当替换字符串中的“\”时,您必须在字符串的“查找”部分中将它们转义。最简单的方法如下

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

或澄清:

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

因为 -replace 中的第一个参数是一个正则表达式,所以它对“\”的处理与后半部分不同,后者是一个字符串数据类型。

于 2013-09-27T20:03:22.360 回答