powershell 获取特定行结果

relj7zay  于 2023-01-02  发布在  Shell
关注(0)|答案(2)|浏览(143)

假设我有一个很大的文本文件,其中包含我检查的每个文件的结果:

...
    Results for: C:\test\test.dll
    Dynamic Base    : "Present"
    ASLR            : "Present"
    High Entropy VA : "Present"
    Force Integrity : "NotPresent"
    Isolation       : "Present"
    NX              : "Present"
    SEH             : "NotPresent"
    CFG             : "NotPresent"
    RFG             : "NotPresent"
    SafeSEH         : "NotPresent"
    GS              : "NotPresent"
    Authenticode    : "NotPresent"
    .NET            : "Present"

    Results for: C:\test\test2.dll
    Dynamic Base    : "Present"
    ASLR            : "Present"
    High Entropy VA : "Present"
    Force Integrity : "NotPresent"
    Isolation       : "Present"
    NX              : "Present"
    SEH             : "NotPresent"
    CFG             : "NotPresent"
    RFG             : "NotPresent"
    SafeSEH         : "NotPresent"
    GS              : "NotPresent"
    Authenticode    : "NotPresent"
    .NET            : "Present"
    ...

我的脚本检查每一行并搜索特定的文件名,在本例中,我们假设为test2.dll

Foreach($line in Get-Content results.txt) {
   if($line -like '*test2.dll*') {
                    
   }
}

如何获取以下6行的结果以下结果:C:\test\test2.dll,例如来自NX
谢谢

uqdfh47h

uqdfh47h1#

使用Array.IndexOf获取特定行的元素索引,然后将该数字减6:

$results = Get-Content results.txt
Foreach($line in $results) {
   if($line -like '*test2.dll*') {
          ## Get the data of 6 rows before
          $results[$results.IndexOf($line)-6]   
   }
}
wrrgggsh

wrrgggsh2#

下面是一种将文件转换为某些对象的方法(有点复杂):

Select-String -Path <path-to-data-file> -Pattern 'Results for: (.*)' -Context 0,13 |
    ForEach-Object {$files = @()}{
        $file = [PsCustomObject]@{
            Name = $_.Matches.Groups[1].Value
        }

        $_.Context.PostContext |
            ForEach-Object {
                $propertyParts = $_.Split(':').Trim() -replace '"', ''

                $file | Add-Member -MemberType 'NoteProperty' -Name $propertyParts[0] -Value $propertyParts[1]
            }

        $files += $file
    }

然后,可以使用标准PowerShell技术操作该集合。例如,可以通过执行以下操作获取“test2.dll”的“NX”值:

($files | Where-Object Name -like '*test2.dll').NX

相关问题