2017-10-05 43 views
0

我有一個包含有關程序信息的文件。 我想要的是獲取有關特定項目的一些信息。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

回答

0

下一頁嘗試

$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

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

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。

0

這裏是不是一個內膽,無正則表達式:

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