我试图取代一些文本在一堆的ps1脚本文件。通常这是没有问题的,但是当替换字符串包含像“$”这样的特殊字符沿着单引号时,我遇到了一些困难。我试过逃避特殊字符,但就是不能让它工作。我要替换的具体文本是。
'WORKVPN1*')
与
'WORKVPN1*') -and ($_.VPN -notlike 'WORKVPN2*')
我尝试了以下代码,但不起作用。
Get-ChildItem "C:\temp\*.ps1" | ForEach-Object -Process {(Get-Content $_) -Replace "'WORKVPN1*')" , "WORKVPN1*'`) -and `(`$_.VPN -notlike 'WORKVPN2*'`)" | Set-Content $_}
2条答案
按热度按时间mftmpeh81#
对于 * 逐字 *(文字)替换,
-replace
,基于正则表达式的字符串替换操作符,需要 * 转义正则表达式操作数 * 和 * 替换操作数,尽管 * 使用不同的机制**。"..."
)**和-replace
(以及-match
和switch -Regex
)。'...'
),如果需要,将它们用作 * 表达式 * 的一部分,以拼接动态部分(e.g.
'a ' + $var + ' b'
而不是"a $var b"
)'...'
引用可以避免"..."
字符串可能出现的潜在混淆,其中字符串的哪些部分由PowerShell预先扩展(插值),而不是由.NET正则表达式引擎最终看到的内容。$_
对正则表达式引擎有特殊的意义,但在"..."
中使用它会扩展自动变量$_
;比较'can' -replace '^', '$_'
-它将输入字符串加倍,正如预期的那样(cancan
)-与'can' -replace '^', "$_"
,它只产生can
,因为自动$_
变量在没有管道上下文的情况下扩展为 * 空字符串 *。适用于您的案例:
注意事项:
''
需要转义'
字符。嵌入在'...'
字符串中*
和)
分别被\
转义。[regex]::Escape()
$&
引用正则表达式捕获的内容(即,* 逐字 *'WORKVPN1*')
$$
用于转义替换操作数中的$
字符,该字符将 * 逐字 * 使用-$
字符是 * 唯一 * 需要在替换操作数中转义的字符-参见Substitutions in Regular Expressions一个替代方法是使用 * 逐字 *(文字)替换使用
[string]
类型的**.Replace()
* 方法***,该方法 * 直接且排他地 * 执行逐字替换:-replace
运算符默认情况下不区分大小写,并通过其-creplace
变体提供大小写敏感性。有关何时使用
-replace
与.Replace()
.e7arh2l62#
-replace使用regex,所以转义regex字符。这个方法为你做到了。
.replace()不使用正则表达式,但这个重载区分大小写:
我只是把星星和括号反斜线。在替换文本中不必对括号加反引号。$$是一个文本$替换的代码。
顺便说一下,我不确定这些-replace代码埋在文档的哪里:
在.replace()中,由于双引号的原因,您仍然需要对美元符号进行反引号。