Проблема с вашей попыткой связана с неправильным чтением Test-script.txt
. Когда вы запускаете команду Get-Content
без ключа -Raw
, файл читается как массив строк. Когда это передано в Select-String
, команда будет обрабатывать только одну строку за раз и ничего не будет знать о предыдущих или следующих строках. Если вы реализуете ключ -Raw
, он будет считываться в файле как одна строка. Затем вы можете перейти на Select-String
и соответствовать символам новой строки. С учетом вышесказанного вам необходимо включить однострочный модификатор (?s
), чтобы .
соответствовал \n
и \r
символам. Поскольку у вас есть несколько совпадений для одного и того же шаблона регулярных выражений, вам необходимо добавить переключатель -AllMatches
.
$getctnt = Get-Content $_.FullName -Raw
$selections = $getctnt | Select-String -Pattern '(?s)(abc)(.*?)(--- End ---)' -AllMatches
$selections
теперь будет содержать массив объектов MatchInfo
, которые можно перебирать или индексировать на основена ваших требованиях. Ниже описан способ доступа к этим значениям.
$selections.Matches # For the MatchInfo objects
$selections.Matches.Value # For the matched values
Поскольку вы использовали несколько наборов скобок, вы создали 4 группы захвата (0,1,2,3) и три полных совпадения. Я не знаю, было ли это вашим намерением, но они также доступны. Чтобы легко получить к ним доступ, вы можете перебирать свои объекты 3 MatchInfo
(всего три совпадения).
$selections.Matches | Foreach-Object {
$_.Groups[0] # Each full regex match
$_.Groups[1] # Capture group 1: (abc)
$_.Groups[2] # Capture group 2: (.*?)
$_.Groups[3] # Capture group 3: (--- End ---)
}