2017-10-05 9 views
0

J'ai un fichier qui contient des informations sur les programmes. Ce que je veux, c'est obtenir des informations sur un prgoram particulier.PowerShell RegEx Sélectionner ligne et analyser les champs

Ceci est la structure du fichier.

sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext 

Je devais obtenir les détails suivants à partir du fichier ci-dessus. chaque champ est séparé avec ;

p = program.exe 
    dt1 = Thu, 04 May 2017 08:58:48 -0700 
    dt2 = Wed, 27 Sep 2017 10:50:00 -0700 
    dt3 = Wed, 04 Oct 2017 00:00:31 -0700 
    d1 = True 
    d2 = False 

Get-Content .\file.txt

Jusqu'à présent, j'ai \W*((?i)program.exe(?-i))\W* pour le match. Mais je ne sais pas comment aller de l'avant, lire tous les champs et l'analyser.

+0

essayez ceci ... '\ W * programme \ .exe \ W * (* (i?) (* ?;.).? ;) (. * ?;) (. * ?;) (. * ?;) ' – kaza

+0

@bulbus c'est bien ... comment puis-je obtenir les valeurs et les assigner à une variable? Merci – Omar

Répondre

0

Suivant essayer

$p,$dt1,$dt2,$dt3,$d1,[email protected]' 
sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext 
'@| 
Select-String '(program.exe)[^;]*(?:;([^;]+)){3}(?:;(true|false)){2},' -AllMatches| 
ForEach-Object {$_.Matches}| 
ForEach-Object {$_.Groups[1..3]}| 
ForEach-Object {$_.Captures}| 
Select-Object -ExpandProperty Value 
$p,$dt1,$dt2,$dt3,$d1,$d2 

Cela peut-il vous aider?

@' 
sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext 
'@| 
Select-String '([^;]+)' -AllMatches| 
ForEach-Object {$_.Matches}| 
ForEach-Object {$_.Groups[1].Value} 

+0

cela me donne 'sometext ... program.EXE' comme premier objet. Comment puis-je commencer avec 'program.exe seulement? De plus, j'ai besoin de stocker les valeurs dans une variable comme dans la question. Merci – Omar

0
>> sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext 
>> @'| 
>> Select-String '(?i)\W*(program\.exe)\W*(.*?;)(.*?;)(.*?;)(.*?;)(.*?;)'| 
>> % {$_.Matches}| 
>> % {$p=$_.Groups[1].Value;$dt1=$_.Groups[2].Value;$dt2=$_.Groups[3].Value;$dt3=$_.Groups[4].Value;$d1=$_.Groups[5].Value;$d2=$_.Groups[6].Value} 
:\> $p 
program.EXE 
:\> $dt1 
Thu, 04 May 2017 08:58:48 -0700; 
:\> $dt2 
Wed, 27 Sep 2017 10:50:00 -0700; 
:\> $dt3 
Wed, 04 Oct 2017 00:00:31 -0700; 
:\> $d1 
True; 
:\> $d2 
False, 17:38:05.810; 
:\> 

OU

IN: \> "sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30.. 
.somtext"| 
IN: >> Select-String '(?i)\W*(program\.exe)\W*(.*?;)(.*?;)(.*?;)(.*?;)(.*?;)' -OutVariable o 
OUT: 
sometext...program.EXE;Thu, 04 May 2017 08:58:48 -0700;Wed, 27 Sep 2017 10:50:00 -0700;Wed, 04 Oct 2017 00:00:31 -0700;True;False, 17:38:05.810;30...somtext 


IN: \> $f,$p,$dt1,$dt2,$dt3,$d1,$d2=% -inputObject $o.Matches.Groups {$_.Value} 
IN: \> $d2 
OUT: False, 17:38:05.810; 

I attribué à chaque groupe de la variable souhaitée. Voyez si cela fonctionne. Excusez-moi pour toute naïveté, je ne suis pas très versé dans la PowerShell.

0

Voici pas un liner, pas regex:

$array = (Get-Content .\file.txt -Raw) -split ';' 
$exe = 'program.EXE' 
for ($i = 0; $i -lt $array.Count; $i++) { 
    if ($array[$i].EndsWith($exe)) { 
     $p = $exe.ToLower() 
     $dt1 = $array[++$i] 
     $dt2 = $array[++$i] 
     $dt3 = $array[++$i] 
     $d1 = $array[++$i] 
     $d2 = $array[++$i] 

     Write-Host "p = $p" 
     Write-Host "dt1 = $dt1" 
     Write-Host "dt2 = $dt2" 
     Write-Host "dt3 = $dt3" 
     Write-Host "d1 = $d1" 
     Write-Host "d2 = $d2" 
    } 
}