regex替换引号中的字符串路径



你好,我在很多服务器上都有一个像这样结尾的配置文件,所以我需要在行的开头添加#

"C: \Documents and Settings\All Users\Application Data\McAfee \DesktopProtection\UpdateLog.txt"8小时警告*0800 1800

"C: \EURNTCC\macafee\successfull update.log.txt"8小时警告*0800 1800

我做了一个类似的小脚本

$file="\serverC$ositetcact_mon.cfg"
$text1='"C:DOCUMENTS AND SETTINGSALL USERSAPPLICATION DATAMCAFEEDESKTOPPROTECTIONUPDATELOG.TXT"'
$text2='"C:EURNTCCMCAFEESUCESSFULL-UPDATE.LOG.TXT"'
(gc $file) -replace $text2 ,("#" + $text1) |Set-Content $file
(gc $file) -replace $text2 ,("#" + $text2) |Set-Content $file

我有这个错误任何帮助来理解这个错误,我有650服务器来更新

正则表达式模式";C: \EURNTCC\MCAFEE\SUCESSFULL-UPDATE.LOG.TXT";无效。在行:1个字符:1个

  • (gc$file(-替换$text1,("#"+$text1(|设置内容$file
  • + CategoryInfo          : InvalidOperation: ("C:EURNTCCMCA...UPDATE.LOG.TXT":String) [], RuntimeException
    + FullyQualifiedErrorId : InvalidRegularExpression
    

-replace使用Regex。您希望它搜索的字符串在正则表达式中具有特殊含义,需要以反斜杠为前缀。(最显著的是点和反斜杠(

您不必手动执行此操作,但可以使用[regex]类型加速器中的静态方法Escape()

$text1 = '"C:DOCUMENTS AND SETTINGSALL USERSAPPLICATION DATAMCAFEEDESKTOPPROTECTIONUPDATELOG.TXT"'
$text2 = '"C:EURNTCCMCAFEESUCESSFULL-UPDATE.LOG.TXT"'
$search1 = [regex]::Escape($text1)
$search2 = [regex]::Escape($text2)

此外,您可以链接replace,这样您就不必获得两次内容:

(Get-Content $file) -replace $search1 ,("#" + $text1) -replace $search2 ,("#" + $text2) | Set-Content $file