Я пытаюсь найти в текстовом файле определенную строку и вывести строку и ее контекст:
$StateCheck = Select-String -Path C:\ImageManagerTool\Results.txt -Pattern "State:*"
$SValueCheck = Select-String -Path C:\ImageManagerTool\Results.txt -Pattern "State Value:*"
If(Get-Content C:\ImageManagerTool\Results.txt | %{$StateCheck -notmatch "State: Active"})
{
Get-Content C:\ImageManagerTool\Results.txt | Select-String -Pattern "State:*"-Context 2,7| Select-String -Pattern "State: Active" -NotMatch |Select-String -Pattern "State Value:*" -NotMatch
}
If(Get-Content C:\ImageManagerTool\Results.txt | %{$SValueCheck -notmatch "State Value: 0"})
{
Get-Content C:\ImageManagerTool\Results.txt | Select-String -Pattern "State Value:*"-Context 3,6| Select-String -Pattern "State Value: 0" -NotMatch
}
Результаты вышеуказанного сценария:
Пока что все, что мне удалось сделать, это вывести экземпляры строк, которые я хочу найти, но не их контекст. При текущей настройке операторов if для фильтрации данных для строк, которые не совпадают, я не понял, будет ли использование параметра -context работать в этой ситуации, поскольку -context недействителен при получении Select- Строковые команды. При чтении Microsoft описания -Context на сайте PowerShell говорится, что контекст хранится как массив строк в свойстве context объекта. Есть ли способ переписать свои части скрипта, чтобы получить желаемый эффект (например, переключатель?), Или использовать параметр контекста в качестве свойства для вывода его данных?





Ваши операторы if совершенно не нужны - Select-String просто ничего не вернет, если ничто не соответствует указанному вами шаблону.
Для второго совпадения регулярного выражения вы можете проверить совпадающую строку с помощью Where-Object вместо цепочки Select-String:
Select-String -Path C:\ImageManagerTool\Results.txt -Pattern "State:*"-Context 2,7|Where-Object {$_.Line -notmatch "State: Active" -and $_.Line -notmatch "State Value:*"}
Второй пример можно упростить еще больше, просто убедитесь, что все, что идет после State Value:, не является 0 - вы можете использовать инвертированный набор символов, например [^0]:
Select-String -Path C:\ImageManagerTool\Results.txt -Pattern "State Value: [^0]" -Context 3,6
Строка для 'State Value' отлично работает, но строка для 'State' показывает только фрагменты данных, и выполнение обеих этих строк в одном скрипте будет запускать каждый из их запросов отдельно друг от друга (т.е. вывод будет показывать строку 308, а затем перейдите к строке 183 и начните оттуда). В случае «Состояние», находится ли контекст в рамках поиска Where-Object?
Вместо того, чтобы читать файл
C:\ImageManagerTool\Results.txtнесколько раз, сохраните его в переменной и действуйте в соответствии с ней. Также покажите содержание редактирование вашего вопроса.