在PowerShell中,如何替换:
Session("*Logging")="true"
到
Session("*Logging")="false"
以下PowerShell脚本不起作用。
get-content E:\WebSystems\Web1\web.config -replace "Session("*Logging")="true"", "Session("*Logging")="false"" | set-content E:\WebSystems\Web1\web.config
它说了一堆错误:
您必须在'*'运算符的右侧提供值表达式。
表达式或语句中出现意外的令牌....
参数列表中缺少参数。
答案 0 :(得分:3)
如果Session("*Logging")="true"
是字符串文字,则需要转义某些字符才能使匹配生效。 -replace
使用正则表达式进行字符串匹配,括号和星号具有特殊功能。您可以做的一件事是使用静态方法[regex]::escape
为您完成艰苦的工作。其他问题是您需要将Get-Content
括在括号中,否则它会将-replace
视为Get-Content
的参数。此字符串也未正确转义,这会导致大多数语法错误。在下面的变量中,我将字符串括在单引号中,这是解决此问题的几种方法之一。
$match = [regex]::escape('Session("*Logging")="true"')
$replace = 'Session("*Logging")="false"'
(get-content E:\WebSystems\Web1\web.config) -replace $match, $replace | ....
转义字符串看起来像Session\("\*Logging"\)="true"
。您不需要为替换字符串本身处理特殊字符。
答案 1 :(得分:3)
您的字符串引用已被混淆,"会话("是一个字符串,然后* Logging落在字符串之外,而PowerShell正试图将其作为乘法或类似处理。
如果您修改了引号,那么您需要转义正则表达式特殊字符以将它们用作字符串文字。
如果你解决了这个问题,我最终会误以为get-content
没有-replace
参数。
如下:
#short commandlet nanmes
(gc E:\WebSystems\Web1\web.config) |% { $_.replace('Session("*Logging")="true"', 'Session("*Logging")="false"') } | sc E:\WebSystems\Web1\web.config
#long form commandlet names
(Get-Content E:\WebSystems\Web1\web.config) |foreach { $_.Replace('Session("*Logging")="true"', 'Session("*Logging")="false"') } | Set-Content E:\WebSystems\Web1\web.config
这使用foreach来访问string.replace()方法,该方法使用字符串文字并避免必须处理正则表达式转义,使用单引号使其中包含带双引号的字符串,并将get-content包含在内括号因此它会读取所有内容并关闭文件,并且不会与set-content冲突。