Как игнорировать escape-последовательности, хранящиеся в строковой переменной PowerShell?
В моем PowerShell script я запускаю 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 без везения.
Ответы
Ответ 1
Использовать статический метод escape()
, он указывает механизму регулярного выражения интерпретировать эти символы буквально, а не как метасимволы:
$id = [regex]::escape($id)
Вы также можете повернуть эту команду в один лайнер (-path
может взять коллекцию файлов):
Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet
Ответ 2
Если строка $id уже содержит что-то вроде TAB, когда она передается вам, тогда я не знаю о встроенном методе, чтобы безопасно сбежать обратно в "\ t". Вы должны убедиться, что ваш script передан правильной строке в первую очередь. То есть он должен пройти 0x5C74 (\ t) не 0x09 (TAB). Таким образом, экранирование должно выполняться, когда сначала определяется строка поиска.
Regex.Escape выйдет из TAB → \t, но также выйдет из любого из этих символов, имеющих смысл в регулярных выражениях:
\, *, +,?, |, {, [, (,), ^, $,., # и пустое пространство
например. , → \.