Как игнорировать 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, но также выйдет из любого из этих символов, имеющих смысл в регулярных выражениях:

\, *, +,?, |, {, [, (,), ^, $,., # и пустое пространство

например.  , → \.