PowerShell Dobule Escape-строка с текстом «$ __ VAR__» - PullRequest
0 голосов
/ 13 декабря 2018

Один из моих сценариев может быть приведен к следующему коду.

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

Обратите внимание, что $_ расширен, и я не хочу его расширять.Я попытался добавить больше escape-символов, но это только заставляет их появляться в файле.Как можно экранировать строку, чтобы предотвратить расширение $_?

1 Ответ

0 голосов
/ 13 декабря 2018

В PowerShell, если вы не хотите, чтобы переменные расширялись в вашей строке, используйте «одинарные кавычки» вместо «двойных кавычек», что избавляет вас от необходимости избегать знака $ с обратными галочками.

Теперь в вашем случае возникает дополнительная проблема: оператор -replace также захочет расширить выражения, начинающиеся со знака $ в строке замены, независимо от используемых вами кавычек.

Чтобы сообщить -replace, что вы действительно хотите видеть $ в вашей замещающей строке, вам нужно написать $$:

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

Примечание : как и другиеправильно указали в комментариях, если ваша задача состоит в том, чтобы вырезать выражения из начального #, вы можете сделать это более простым способом:

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

Или, в качестве альтернативы, с помощью старой доброй «отделки»:

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