Как я могу избежать символа 'в параметре powershell? - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть скрипт powershell, выполняемый для проверки различий в коммитах между двумя git ветвями. Вот что я получаю из выражения git:

$result  = Invoke-Expression "& git rev-list --left-right --count origin/$TargetBranch...origin/$SourceBranch 2>&1"

К сожалению, я обнаружил, что когда $SourceBranch содержит ' символ, он выдает

[ошибка ] В строке: 1 символ: 143 + ..._ move_to_record_icon_does't_respond 2> & 1

В строке отсутствует терминатор: '.

Я реализовал экранирование специальных символов, таких как это: [System.Text.RegularExpressions.Regex]::Escape($SourceBranch) затем $SourceBranch.replace('\','`')

Но он не экранирует символ ', его помещение в replace("'","`'") также не работает.

Используется Powershell 5.0.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Просто избегайте Invoke-Expression в целом:

$result = & git rev-list --left-right --count origin/$TargetBranch...origin/$SourceBranch 2>&1
0 голосов
/ 23 апреля 2020

Вам нужно экранировать сам символ экранирования.

Пример запуска a'b.bat в PowerShell,

# create filename containing '
echo "echo 1" | Set-Content -Encoding Ascii "a'b.bat"

# double quote
Invoke-Expression ".\a``'b.bat"
Invoke-Expression ".\a''''b.bat"

# single quote
Invoke-Expression '.\a`''b.bat'
Invoke-Expression '.\a''''''''b.bat'

# with -replace operator
$source = ".\a'b.bat"
Invoke-Expression "cmd /c $($source -replace "'", "''''" )"

Это может выглядеть странно, но точно так же, как
JSON.stringify({a: "\\"}) === "{\"a\":\"\\\\\"}" in JavaScript.

, но гораздо проще без использования Invoke-Expression, как уже ответили.

& ".\a'b.bat"
& '.\a''b.bat'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...