代码之家  ›  专栏  ›  技术社区  ›  Farbkreis

Powershell中选择对象的更高性能替代方案

  •  0
  • Farbkreis  · 技术社区  · 4 年前

    我在powershell中读取了一个大Json,然后通过

    select-object -Property $myProperties
    

    它运行得很好,但速度很慢。

    还有更多的表演替代品吗?

    我读了一些关于linq的文章,但我不确定这是否能解决我的问题。我也想过读一下com 从convertfrom json通过-ashashtable运算符将内容作为hashtable,然后通过.remove运算符删除不必要的属性,但这需要对数组进行额外处理。

    有人有一般性的建议吗?首选的解决方案是什么?

    完整脚本

    function Start-TestDatabaseFile {
        param (
            $folderSoll,
            $folderIst
        )
    
        $workfolderPath = $workfolder.path
    
        $errors = 0
    
        $dbInfo = Get-dbInformation
    
        $localFolder = "$workfolderPath\TestResults\DatabaseFileDifference"
        New-Item $localFolder -ItemType Directory | Out-Null
    
        $differencePerTable = "$workfolderPath\TestResults\DatabaseFilePerTable"
        New-Item $differencePerTable -ItemType Directory | Out-Null
    
        $keys = $result.Keys | Sort-Object
    
        foreach ($key in $keys) {
            #region File Datenmodell
            $firstItemFile = $result[$key].fileRaw.Replace('_response.json', '_Datenbank.json')
    
            $tf = $result[$key].tf
            $myTestfall = $myTest[$tf].root
    
            if ($null -ne $myTestfall) {
                $responseFile = Split-Path $firstItemFile -Leaf
                $myPath = $result[$key].myPath
                $file = Join-Path $myTest[$myTestfall].folder -ChildPath ("$myPath\$responseFile")
                $secondItemFile = $file.Replace('\Requests\', '\Responses_SOLL\')
            }
            else {
                $secondItemFile = $firstItemFile.replace($folderIst, $folderSoll)
            }
    
            try {
                $firstItemAll = Get-Content $firstItemFile -ErrorAction Stop | ConvertFrom-Json -AsHashtable
                $firstItem = $firstItemAll.post
                $firstItemExists = $true
            }
            catch {
                $firstItem = '{}' | ConvertFrom-Json -AsHashtable
                $firstItemExists = $false
            }
    
            try {
                $secondItemAll = Get-content $secondItemFile -ErrorAction Stop | ConvertFrom-Json -AsHashtable
                $secondItem = $secondItemAll.post
                $secondItemExists = $true
            }
            catch {
                $secondItem = '{}' | ConvertFrom-Json -AsHashtable
                $secondItemExists = $false
            }
    
            $views = $dbInfo.keys | Where-Object { $_ -like 'V*' }
    
            foreach ($view in $views) {
                $schalter = $dbInfo[$view].myItem
                if ($firstItemExists) {
                    try {
                        $firstItem.$view = [array]($firstItem.$view | Select-Object -Property $dbInfo[$view].fieldsCompare)
                    }
                    catch {
                        [console]::WriteLine('Issue in Start-TestDatabaseFile ExceptionPoint1')
                    }
                }
    
                if ($secondItemExists) {
                    if ($null -ne $myTestfall) {
                        $secondItem.$view = $secondItemAll.pre.$view
                    }
    
                    if ($useNewDm.$schalter) {
                        $secondItem.$view = [array]($secondItem.$view | Select-Object -Property $dbInfo[$view].fieldsCompare)
                    }
                    else {
                        $secondItem.$view = [array]($firstItemAll.pre.$view | Select-Object -Property $dbInfo[$view].fieldsCompare)
                    }
                }
            }
    
            $firstItemJson = $firstItem | ConvertTo-Json -Depth 100
            $secondItemJson = $secondItem | ConvertTo-Json -Depth 100
    
            $result[$key].resultDatabaseFile = Compare-Json -ist $firstItemJson -soll $secondItemJson
            $result[$key].passedDatabaseFile = 'passed'
    
            if ($null -ne $result[$key].resultDatabaseFile.difference) {
                $filename = $key.replace('\', '_')
    
                $result[$key].resultDatabaseFile.difference | Out-File -FilePath ("$localFolder\$filename.json")
    
                #region tmp out
                $difference = $result[$key].resultDatabaseFile.difference | ConvertFrom-Json
                $diffKeys = (Get-Member -InputObject $difference -MemberType NoteProperty).Name
    
                foreach ($diffKey in $diffKeys) {
    
                    $file = "$differencePerTable\$diffKey.json"
    
                    Add-Content -Path $file -Value $key
                    Add-Content -Path $file -Value ($difference.$diffkey | ConvertTo-Json)
                }
                #endregion
    
                $result[$key].passedDatabaseFile = 'failed'
    
                $errors += 1
            }
            #endregion
        }
    
        return $errors
    }
    
    0 回复  |  直到 4 年前
    推荐文章