Переменная после выбранной строки не показывает никакого значения

#powershell

Вопрос:

Я пытаюсь выполнить проверку регулярных выражений в файле журнала macos под названием systemextensions.txt. Содержимое файла, в качестве примера, выглядит следующим образом:

 2 extension(s) 

--- com.apple.system_extension.endpoint_security enabled active teamID bundleID (version) name [state] 

GT8P3H7SPW com.mcafee.CMF.networkextension (10.7.6/1) McAfee Network Extension [terminated waiting to uninstall on reboot]

D3U2N4A6J7 com.protection.agent (02.00.07.1001/1.5.0) com.protection.agent [activated enabled]
 

То, что я пытаюсь, после проверки того , что размер файла больше 0, — это выбрать строку расширения, извлечь из нее числовое значение и посмотреть, больше ли оно 0. В случае, если это не так, я покажу сообщение о том, что системные расширения не найдены, и если это так, я попытаюсь получить значение тех, которые включены. Проблема в том, что когда с помощью select-string я пытаюсь получить числовое значение в переменной, оно ничего не возвращает, хотя строка без переменной возвращает.

 If ($systemext.Length -gt 0)
{
    $numext = Select-String $systemext.FullName -Pattern 'extension(s)' -SimpleMatch | Select-String -Pattern 'd'
    If ($numext.Matches.value -eq 0) {Write-host = "No system extensions found"}
    else {$extenabled = Select-String $systemext.FullName -Pattern 'activated enabled'}
}
 

Я попробовал со следующими строками (изменив последующие, если), и переменные оказались пустыми:

1-.

 $numext = Select-String $systemext.FullName -Pattern 'extension(s)' -SimpleMatch | Select-String -Pattern 'd' | foreach {$_.Matches.Value}
 

и 2-.

изменение $numext на

 $numext = Select-String $systemext.FullName -Pattern 'extension(s)' -SimpleMatch
 

и затем :

 $test = ($numext | Select-String -Pattern 'd').Matches.Value
 

Ответ №1:

Учитывая содержимое файла, которое вы упомянули, это должно дать вам номер из 2 extension(s) строки:

 (Select-String -Path $systemext.FullName -Pattern '^(?:d ) (?=extension(s))').Matches.Groups[0].Value
 

В вашем примере он должен просто выводить:
2

Если совпадения вообще нет (например, строка отсутствует или изменен формат), то вы, скорее всего, получите сообщение об ошибке при доступе Groups[0] , поэтому вы можете разделить эту единственную строку на несколько шагов, чтобы проверить, сработала ли она, прежде чем пытаться получить доступ к результату.