传递字符串包含美元符号到-Replace Variable

时间:2010-02-05 10:35:23

标签: powershell

我正在尝试使用powershell替换.config文件中的句子。

${c:Web.config} = ${c:Web.config} -replace

'$BASE_PATH $ \ Test \ bin` $ Test_TYPE` $ \ WebTest.dll','c:\ program Files \ example \ webtest.dll'

每次我尝试运行上面的代码我都会

  

“无效的正则表达式模式:   $ BASE_PATH $ \测试\ BIN \ $ Test_TYPE $ \ WebTest.dll”   在c:\ tests \ runtesting.ps1 -replace   <<<<   $ $ BASE_PATH \测试\ BIN \ $ Test_TYPE $ \ WebTest.dll

如果我不使用反击,美元符号将会消失,并会显示一些文字。

如何将字符串中的美元符号传递给 - 替换?

4 个答案:

答案 0 :(得分:5)

这是关于如何逃避正则表达式的 。应该使用$

转义每个特殊字符(特殊关于正则表达式),例如\
'$A$B()[].?etc' -replace '\$|\(|\)|\[|\]|\.|\?','x'
'$BASE_PATH$\Test\bin$Test_TYPE$\WebTest.dll' -replace '\$BASE_PATH\$\\Test\\bin\$Test_TYPE\$\\WebTest.dll','something'

当正则表达式如下时,将使用反引号:

'$A$B' -replace "\`$",'x'

答案 1 :(得分:4)

通过:

$BASE_PATH$\Test\bin\$Test_TYPE$\WebTest.dll

更改为:

`"\`$BASE_PATH\`$\\Test\\bin\\\`$Test_TYPE\`$\\WebTest.dll"`

逻辑:

  • 在每个美元符号之前输入\`
  • 在每次反斜杠之前输入另一个反斜杠\
  • 使用双引号“”
  • 关闭字符串

答案 2 :(得分:1)

为了向stej's answer提供更多背景知识,这里有两件事:

1)在解析命令时,powershell在-replace的字符串参数中为expanding the variables(例如,字符串"shell: $ShellId"将展开{{} 1}}变量,产生ShellId)。使用反引号转义字符或使用单引号声明字符串可以防止这种情况(shell: Microsoft.PowerShell"shell: `$ShellId"变为'shell: $ShellId')。

2) shell: $ShellId运算符使用.NET regular expressions,其中-replace$\字符是特殊语言元素。使用反斜杠转义字符可以将特殊字符视为正则表达式中的文字值(例如.将匹配一个美元字符,而\$将匹配该行的结尾)。由于powershell和正则表达式都使用$,因此必须将其转义两次(使用$"\`$")。

在这种情况下,另一种方法是使用string.Replace方法,它将执行区分大小写的替换:

'\$'

答案 3 :(得分:1)

对于那些不熟悉这种区别的人,重要的是不要将反引号字符(`)单引号字符混淆<在这些逃脱中强>(')。例如:

[SUCCESS] 将双引号用作带反斜杠后缀的容器作为转义:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\`$old", "(New)"}
What is (New)?
PS C:\Temp>

[FAIL] 将双引号用作带反斜杠撇号的容器作为转义:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\'$old", "(New)"}
What is $old?
PS C:\Temp>

[SUCCESS] 单引号作为容器,带有简单的反斜杠作为转义:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\$old', "(New)"}
What is (New)?
PS C:\Temp>

[FAIL] 单引号作为容器,反斜杠 - 反引号为转义:

PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\`$old', "(New)"}
What is $old?
PS C:\Temp>

总的来说,最简单的选择可能是使用单引号作为容器,使用单个反斜杠作为转义:'\$old'