h41msh1c0r
Goto Top

Powershell json auswerten irre langsam oder leer

Aloa,

function Get-ObjectMembers {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory=$True, ValueFromPipeline=$True)]
        [PSCustomObject]$obj
    )
    $obj | Get-Member -MemberType NoteProperty | ForEach-Object {
        $key = $_.Name
        [PSCustomObject]@{Key = $key; Value = $obj."$key"}  
    }
}

$Quelle       = "C:\Temp\JsonTest"  

$PSCustomResultArray = @()

gci -Path $Quelle | % {  Get-Content -Raw $_.FullName | ConvertFrom-Json |Get-ObjectMembers | Where-Object Key -Match "VersionInfo" | %{  
    $_.Value | %{

            $rc = New-Object PSObject
            $rc | Add-Member -type NoteProperty -name Pfad -Value $_.Filename
            $rc | Add-Member -type NoteProperty -name Version -Value $_.FileVersion
            $PSCustomResultArray += $rc
            Remove-Variable rc
          }
      }
}

$PSCustomResultArray | Sort-Object -Property Pfad -Descending


Es wird schonmal das aus den json Dateien ausgelesen was ich haben will, Pfad mit Dateinamen und die Dateiversion. =)

Bei ein paar json stört die Laufzeit nicht, bei 20k json schon.
Denke der Übeltäter ist das PSObject was bei jeder Umdrehung erneut erstellt wird.

Erstelle ich das Object außerhalb und befülle das $rc bei jeder Runde neu, ist das PSCustomResultArray am Ende leer.

Eine Idee?

VG

Content-ID: 621505

Url: https://administrator.de/contentid/621505

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

erikro
erikro 12.11.2020 um 18:47:10 Uhr
Goto Top
Moin,

lass das mal mit dem Piping auf foreach-Object und nimm statt dessen foreach-Schleifen. Das sollte erheblich schneller gehen. Vorausgesetzt es ist genug Speicher frei.

hth

Erik