Regex no powershell

1

Estou tentando usar o powershell para corresponder ao nome de usuário e ao status do usuário abaixo:

Internal user ID:        1     Login name: ADMINISTRATOR    
Last login:
Last update user ID:     2     Date and time created: Tue Oct-25-2016 10:59:31
User status:             ENABLED       Reason for last status change:          0

Com meu construtor de regex, estou trabalhando:

Login name:\s+(\w+)\n.*\n.*\nUser status:\s+(ENABLED|DISABLED)

mas quando eu uso isso em select-string ele não retorna nada. Qualquer coisa óbvia estou fazendo errado?

powershell:

$as = select-string "c:\users\ssfors\desktop\audit\user.rep" -pattern "Login name:\s+(\w+)\n.*\n.*\nUser status:\s+(ENABLED|DISABLED)"
foreach ($a in $as) {
echo $a.matches.groups[1].Value
}
    
por Stuey Baby 10.02.2017 / 11:23

1 resposta

0

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.

    
por 10.02.2017 / 12:51