带有文本“$__VAR__”的 PowerShell Dobule 转义字符串

PowerShell Dobule Escape string with text "$__VAR__"

我的一个脚本可以简化为以下代码。

function Replace
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory, Position=0)]
        [string]
        $LiteralPath,

        [Parameter(Mandatory, Position=1)]
        [string]
        $Expression,

        [Parameter(Mandatory, Position=2)]
        [string]
        $Replacement
    )

    Get-Content $LiteralPath | ForEach-Object {$_ -replace $Expression, $Replacement } | Set-Content $LiteralPath + ".temp"
}

脚本调用示例为

Replace ".\MyFile.txt" "^#define abc.*" "#define abc 1"

我遇到了 运行 我需要查找和替换的字符串同时包含美元符号和下划线的情况。必须转义美元符号以防止 PowerShell 扩展变量。一个字符串包含一个美元符号,后跟一个下划线。这导致了一个问题,因为 PowerShell 没有扩展变量名,而是扩展了 $_ 管道变量。如何防止 PowerShell 扩展变量名和管道标记。

这是一个用我需要转义的字符串调用函数的示例。

Replace ".\MyFile.txt" "^\#\`$__LIBRARY_DIR\prj.gpj" "`$__LIBRARY_DIR\prj.gpj"

在此示例中,显示为 #$__LIBRARY_DIR\prj.gpj 的文本行正在更改为 #$__LIBRARY_DIR\prj.gpj_LIBRARY_DIR\prj.gpj我正在寻找要更改为$__LIBRARY_DIR\prj.gpj

的文本

请注意 $_ 已展开,我不希望它展开。我尝试添加更多转义字符,但这只会导致它们出现在文件中。如何对字符串进行转义以防止 $_ 扩展?

在 powershell 中,如果您不希望变量在您的字符串中扩展,请使用 'single quotes' 而不是 "double quotes",这样可以省去转义 $ 符号的麻烦反引号。

现在,在您的情况下,您面临着额外的挑战,即 -replace 运算符还希望在替换字符串中扩展以 $ 符号开头的表达式,而不管引号的类型如何你用的。

要告诉 -replace 您确实想在替换字符串中看到 $,您需要编写 $$:

'#$__LIBRARY_DIR\prj.gpj' -replace '^#$__LIBRARY_DIR\prj.gpj','$$__LIBRARY_DIR\prj.gpj'

注意:正如其他人在评论中正确指出的那样,如果您的任务是从前导 # 中删除表达式,您可以在更多简单方法:

'#$__LIBRARY_DIR\prj.gpj' -replace '^#'

或者用旧的 "trim":

'#$__LIBRARY_DIR\prj.gpj'.TrimStart('#')