Как игнорировать escape-последовательности, хранящиеся в строковой переменной PowerShell? - PullRequest
20 голосов
/ 09 февраля 2009

В моем скрипте PowerShell я запускаю Select-String для нескольких файлов, ища строку, переданную в него через переменную ($ id):

foreach ($file in (ls "path\to\files")) {
    $found = $false
    $found = Select-String -Path $file $id -Quiet
    if ($found) {
        break
    }
}

К сожалению, переменная $ id иногда имеет такие значения, как "\ C" или "\ T", которые Select-String пытается интерпретировать как escape-последовательности. Это недопустимые escape-последовательности, поэтому Select-String выдает ошибку. Они не предназначены для использования в качестве escape-последовательностей (например, это может быть часть пути к файлу, например «C: \ Test»), так как я могу предотвратить интерпретацию PowerShell / Select-String их как таковых? Я попытался использовать круглые скобки вокруг $ id без удачи.

Ответы [ 3 ]

32 голосов
/ 09 февраля 2009

Используйте статический метод escape(), он указывает механизму регулярных выражений интерпретировать эти символы буквально, а не как метасимволы:

$id = [regex]::escape($id)

Вы также можете превратить команду в одну строку (-path может принимать коллекцию файлов):

Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet
0 голосов
/ 23 марта 2018

Select-String имеет параметр -SimpleMatch, который заставит командлет выполнять простые совпадения строк вместо регулярных выражений. Если вы измените скрипт на:

 $found = Select-String -Path $file $id -Quiet -SimpleMatch

это должно работать как нужно.

0 голосов
/ 09 февраля 2009

Если строка $ id уже содержит что-то вроде TAB, когда она передается вам, я не знаю встроенного метода для безопасного возврата ее обратно в "\ t". Вы должны убедиться, что ваш скрипт в первую очередь передал правильную строку. То есть необходимо передать 0x5C74 (\ t), а не 0x09 (TAB). Таким образом, экранирование должно быть выполнено, когда строка поиска впервые определена.

Regex.Escape будет экранировать TAB -> \ t, но также экранирует любой из этих символов, которые имеют значение в регулярных выражениях:

\, *, +,?, |, {, [, (,), ^, $,., # И пробел

например. , -> \.

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