PowerShell正则表达式选择行并解析字段

问题描述:

我有一个包含有关程序信息的文件。 我想要的是获取有关特定项目的一些信息。PowerShell正则表达式选择行并解析字段

这是文件的结构。

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 

我是从上面的文件中得到以下细节。每个字段与;

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

分离到目前为止,我有\W*((?i)program.exe(?-i))\W*与之相匹配的。 但我不知道如何前进,阅读所有的字段并解析它。

+0

试试这个...'\ W *程序\ .exe文件\ W *(*(我?)(* ?;)。? ;)(。* ?;)(。*?;)(。* ?;)' – kaza

+0

@bulbus这是好的...我如何获取值并将它们分配给变量?谢谢 – Omar

下一页尝试

$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 

这能帮助你吗?

@' 
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

这给了我'sometext ... program.EXE'作为第一个对象。我如何从'program.exe only'开始。此外,我需要将值存储到像我在问题中的变量。谢谢 – Omar

>> 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; 
:\> 

OR

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; 

我分配每个组所需的变量。看看这是否有效。对任何天真的道歉,我不熟悉PowerShell。

这里是不是一个内胆,无正则表达式:

$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" 
    } 
}