PowerShell复杂 - 替代

时间:2014-11-18 21:16:59

标签: powershell

在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

它说了一堆错误:

您必须在'*'运算符的右侧提供值表达式。

表达式或语句中出现意外的令牌....

参数列表中缺少参数。

2 个答案:

答案 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冲突。