Se você observar a pergunta a seguir, verá uma maneira de usar o PowerShell / Select-String
para usar o modo de linha única: Multiline regex para corresponder ao bloco de configuração
O problema que você está enfrentando é que, por padrão, um RegEx geralmente é aplicado por linha de entrada. Então o seu RegEx está trabalhando apenas na primeira linha que tem Internal user ID
e Login name
.
O que você precisa fazer é remover as quebras de linha de sua entrada ou informar Select-String
para usar o modo de linha única. Em ambos os casos, você deve ajustar seu RegEx para não usar \n
, pois não será necessário. Você poderia fazer assim:
Login name:\s+(\w+)\s+.*?User status:\s+(ENABLED|DISABLED)
Depois disso, você precisa ajustar sua entrada, por exemplo, executando -replace ''n'
(observe também que você deve estar usando 'n
no PowerShell) ou você poderia usar um modificador na entrada como indicado na pergunta acima. Seu RegEx mudaria nesse caso para:
(?s)Login name:\s+(\w+)\s+.*?User status:\s+(ENABLED|DISABLED)
Mesmo depois de tudo isso, você ainda não estará pronto, Select-String
retorna linha por linha de uma entrada se você fornecer -Path
, então é uma boa idéia ler o arquivo inteiro de uma só vez.
Um exemplo pode ser o seguinte:
$fileContent = (Get-Content c:\users\ssfors\desktop\audit\user.rep) -join ''
$results = $fileContent | Select-String -pattern "Login name:\s+(\w+)\s+.*?User status:\s+(ENABLED|DISABLED)" -AllMatches
foreach($match in $results.Matches){
foreach($group in $match.Groups){
echo $group.Value
}
}
if($results.Matches.Count -eq 1 -and $results.Matches[0].Groups.Count -eq 3){
echo "User Name:", $results.Matches[0].Groups[1].Value;
echo "Status:", $results.Matches[0].Groups[2].Value;
}
Observe que o exemplo não usa o modificador de linha única porque não é necessário. Está lendo o arquivo e concatenando as linhas usando nada como um delimitador.