Было отмечено, что правильный синтаксический анализ XML, как правило, предпочтительнее, но вы пояснили, что вы сохраняете точное форматирование входного файла для целей без отвлечения рассылки позже.
Действительно, единственный способ определить, действительно ли операция -replace
выполнила замену, - сравнить входную строку со строкой результата.
(As Матиас Джессен указывает, что только оператор -match
(и switch -regex
) заполняет автоматическую переменную $Matches
, отражающую результаты операции сопоставления с регулярным выражением).
В простейшем случае:
$original = 'foo'
$potentiallyModified = $original -replace 'x', 'y'
$replacementWasMade = $original -cne $potentiallyModified
Примечание:
-cne
вместо -ne
используется для сравнения с учетом регистра , а также для обнаруженияслучай, когда замена только изменила регистр входной строки.
Возможно, могла быть выполнена эффективная безоперационная замена (например, 'foo' -replace 'o', 'o'
), который выше не обнаруживает;Тем не менее, в то время как новый экземпляр [string]
возвращается в таких случаях, это обычно не имеет значения, учитывая, что строки обычно сравниваются по равенству значение , а не ссылка равенство - см.ниже.
Если производительность имеет первостепенное значение в этом сценарии - я сомневаюсь, что это имеет значение в большинстве случаев - вы можете применить следующую микрооптимизацию , используя ( документированный ) тот факт, что если указанное регулярное выражение не соответствует, входная строка возвращается как есть (то же самое *)1055 * экземпляр):
$original = 'foo'
$potentiallyModified = $original -replace 'x', 'y'
# Test for reference equality.
$replacementWasMade = -not [object]::ReferenceEquals($original, $potentiallyModified)
Ваш конкретный случай использования:
Вы должны использовать $content = (Get-Content -Raw $fileFullName)
, то есть -Raw
переключите , чтобы прочитать входной файл как одну строку и выполнить операцию -replace
с этой одной строкой .
В противном случае вы получите массив строк и поведение -eq
изменяет с LHS со значением массива для выполнения фильтраering LHS вместо возврата логического значения.
Кроме того, -eq
RHS будет также массивом (массивом строк с потенциально измененными строками), который приведен к одна строка с элементами, разделенными пробелом, что означает, что он не будет работать должным образом:
PS> 'foo', 'bar' -eq 'foo', 'bar'
# !! NO OUTPUT
То есть RHS был приведен к единственной строке 'foo bar',который не соответствует ни одному элементу LHS, поэтому был возвращен пустой массив .
Что касается производительность :
Чтобы ускорить ввод-вывод файла, избегайтеКомандлеты и использовать типы .NET напрямую:
$content = [IO.File]::ReadAllText($fileFullName)