но break
заканчивает мою программу
Причина в том, что break
в конвейере не выходит из конвейера, он выходит любые включающие l oop (foreach
, for
, do
и while
операторы), и если их нет, сценарий в целом завершается.
Однако вы можете просто изменить свой подход, чтобы использовать foreach
l oop, где break
работает, как и ожидалось:
# The last line to include in the output.
$stopLine = 'CHDN = 84; // CH du Nord - Luxembourg , 2019'
# Output all lines up to and including the stop line.
# Simply assign to a variable to capture all output lines:
# $linesOfInterest = foreach ($line ...) { ... }
# Or wrap in $(...) to send to a file.
# $(foreach ($line ...) { ... }) | Set-Content ...
foreach ($line in Get-Content file.txt) {
$line
if($line -eq $stopLine) {break }
}
В качестве альтернативы используйте решение на основе регулярных выражений, которое захватывает все интересующие вас линии в виде одной многострочной строки (которую можно разбить на строки с помощью -split '\r?\n'
, если необходимо):
# The last line to include in the output.
$stopLine = 'CHDN = 84; // CH du Nord - Luxembourg , 2019'
# Use the -match operator with a regex that that captures everything
# from the beginning of the the file through the stop line, inclusively.
if ((Get-Content -Raw file.txt) -match '(?sm).*^{0}$' -f [regex]::Escape($stopLine)) {
# Output what was captured.
# Append -split '\r?\n' to split into an array of lines.
$Matches[0]
}
(?sm)
устанавливает параметры регулярных выражений s
(также, чтобы .
соответствовало символам перевода строки) и m
(* ^
и $
соответствуют e nd и начало отдельных строк)
.*
соответствует любой последовательности символов, в том числе ни одной
^{0}$
соответствует экранированной линии останова (через [regex]::Escape()
, чтобы обеспечить его полное совпадение буквально ), где {0}
- это заполнитель для экранированной строки, замененной на -f
, Оператор форматирования строки
Если -match
, оператор сопоставления регулярного выражения завершается успешно, он заполняет automati c $Matches
переменная , чья запись 0
содержит то, что полностью соответствует регулярному выражению.