Я неправильно использую -notmatch
?
Вы используете его неправильно, если $line
содержит подстроку для поиска буквально (as- дословно) в строках входного файла, и эта подстрока содержит метасимволы регулярных выражений , такие как .
и $
.
Для использования -match
/ -notmatch
для буквального соответствия подстроки необходимо escape подстроки:
$_ -notmatch [regex]::Escape($line)
Если вы хотите сопоставить только строки в полном объеме , вы должны anchor регулярное выражение:
$_ -notmatch ('^' + [regex]::Escape($line) + '$')
Обратите внимание, что PowerShell не имеет оператора для литерального соответствия подстроки.
Однако * 1036 Тип *System.String
([string]
) имеет метод .Contains()
для сопоставления литеральной подстроки, но не так, в отличие от операторов PowerShell, он чувствителен к регистру по умолчанию (существуют перегрузки для сопоставление без учета регистра):
-not $_.Contains($line) # case-sensitive, literal substring matching
# case-INsensitive, literal substring matching
-not $_.Contains($line, 'CurrentCultureIgnoreCase')
Для сопоставления с полной строкой:
-not ($_.Length -eq $line.Length -and $_.Contains($line))
Преимущество использования .Contains()
состоит в том, что он pe rforms лучше, чем -match
, хотя последний предлагает гораздо большую гибкость.