我对这个有点迷茫。无论出于何种原因,powershell 中的替换函数都不能很好地处理以 $ 符号结尾的变量。
命令:
$var='A#$A#$'
$line=('$var='+"'"+"'")
$line -replace '^.+$',('$line='+"'"+$var+"'")
预期输出:
$line='A#$A#$'
实际输出:
$line='A#$A#
我对这个有点迷茫。无论出于何种原因,powershell 中的替换函数都不能很好地处理以 $ 符号结尾的变量。
命令:
$var='A#$A#$'
$line=('$var='+"'"+"'")
$line -replace '^.+$',('$line='+"'"+$var+"'")
预期输出:
$line='A#$A#$'
实际输出:
$line='A#$A#
看起来您遇到了不想要的正则表达式替换。正则表达式特殊变量$'
表示匹配后的所有内容。由于您的正则表达式匹配整个字符串,$'
因此实际上是空的。在替换操作期间,.Net 正则表达式引擎$'
会在您的预期输出中看到并替换该空字符串。
避免这种情况的一种方法是将$
字符串中的$var
所有实例替换为$$
:
$line -replace '^.+$',('$line='+"'"+($var.Replace('$','$$'))+"'")
您可以在此处查看有关 .Net 中正则表达式替换的更多信息:
通过将 $ 替换为特殊字符,然后在更改后将其恢复回来,我能够找到某种创可贴。最好选择一个键盘上没有键的字符。对我来说,我选择了“¤”。
$var='A#$A#$'
$var=$var -replace '\$','¤'
$line=("`$var=''")
$line -replace '^.+$',("`$line='$var'") -replace '¤','$'
我不太了解您发布的行的目的,在我看来这样做更有意义$line='$line='''+$var+"'"
,但是如果您坚持自己的方式,只需进行两次替换调用,如下所示:
$line -replace '^.+$',('$line=''LOL''') -replace 'LOL',$var