PowerShell从[pscustomobject]属性计数创建新的[pscustomobject]

PowerShell从[pscustomobject]属性计数创建新的[pscustomobject],powershell,Powershell,现在我需要用另一个[pscustomobject]的数据创建新的[pscustomobject]。创建一个报告。 使用这个新的[pscustomobject],我将导出到excel 我的代码: Function ConvertTo-MultiArray { param( [Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)] [PSObject[]]$InputObject ) BEGIN {

现在我需要用另一个[pscustomobject]的数据创建新的[pscustomobject]。创建一个报告。 使用这个新的[pscustomobject],我将导出到excel

我的代码:

Function ConvertTo-MultiArray {

param(
    [Parameter(Mandatory=$true, Position=1, ValueFromPipeline=$true)]
    [PSObject[]]$InputObject
)
BEGIN {
    $objects = @()
    [ref]$array = [ref]$null
}
Process {
    $objects += $InputObject
}
END {
    $properties = $objects[0].psobject.properties |%{$_.name}
    $array.Value = New-Object 'object[,]' ($objects.Count+1),$properties.count
    # i = row and j = column
    $j = 0
    $properties |%{
        $array.Value[0,$j] = $_.tostring()
        $j++
    }
    $i = 1
    $objects |% {
        $item = $_
        $j = 0
        $properties | % {
            if ($item.($_) -eq $null) {
                $array.value[$i,$j] = ""
            }
            else {
                $array.value[$i,$j] = $item.($_).tostring()
            }
            $j++
        }
        $i++
    }
    $array
  }
}

   function Convert-TimeString ([String]$Time, [String[]]$Format)
 {
   $result = New-Object TimeSpan

   $convertible = [TimeSpan]::TryParseExact(
   $Time,
   $Format,
   [System.Globalization.CultureInfo]::InvariantCulture,
   [ref]$result)

   if ($convertible) { $result.ToString('hh\:mm\:ss\.fff') }
   }

   $allMediaFiles = Get-ChildItem -Path C:\Users\User\Documents\ScripsPS1\xip\Testes\*   | % {
   $content = get-content -Path $_ -Raw
   $xml = [xml]$content
 

    [pscustomobject]@{
       video_audio = $xml.XIP.ContentObject.CustomType
       SecurityTag = $xml.XIP.ContentObject.SecurityTag 
       Duration = ($xml.XIP.Generation.Properties.Property | where {$_.PropertyName -eq  "Duration"}).value
      Format = $xml.XIP.Bitstream.Filename -replace ".*\.", ""
   }    
}

    $tt =[pscustomobject]@{
    FileTypes = $allMediaFiles | ? {$_.video_audio} | select -ExpandProperty video_audio -Unique
    O_OpenAccess = 'a'  
    U_UserAccess = 'c'
    S_SubscriberAccess = 'd'
    Duration = 'e'
  }

     $allMediaFiles | ? {$_.video_audio -eq "video"} |  ForEach-Object {

     if ($_.Duration -match "H|M|S") {
     $_.Duration = (Convert-TimeString -Time $_.Duration -Format 'm\Ms\.fff\S')
     [TimeSpan[]]$DurationVideo += $_.Duration
     }    
  } 
     $Result1 = ($DurationVideo | Measure-Object -Property TotalMilliseconds -Sum).Sum
     $mts =  [timespan]::FromMilliseconds($Result1)
     $VideoTime =("{0:hh\:mm\:ss\,fff}" -f $mts)
    [pscustomobject]@{'Timespan' = $VideoTime} 

    Clear-Variable -Name "DurationVideo"

    $allMediaFiles | ? {$_.video_audio -eq "audio"} |  ForEach-Object {
    [TimeSpan[]]$DurationAudio +=$_.Duration       
   }   
    $Result2 = ($DurationAudio | Measure-Object -Property TotalMilliseconds -Sum).Sum
    $Nts =  [timespan]::FromMilliseconds($Result2)
    $AudioTime =("{0:hh\:mm\:ss\,fff}" -f $Nts)
    [pscustomobject]@{'Timespan' = $AudioTime} 

     Clear-Variable -Name "DurationAudio"


     $DurationColl = $allMediaFiles | ? {$_.video_audio} | Group-Object -Property Duration |  Select Name

     $outItems = New-Object System.Collections.Generic.List[System.Object]
     [TimeSpan[]]$outItems = foreach ($eachtimer in $DurationColl){
     if ($eachtimer -match 'H|M|S'){Convert-TimeString -Time  $eachtimer -Format 'm\Ms\.fff\S' }
   else {
         Convert-TimeString -Time $eachtimer -Format "h\:mm\:ss"} 
}

    $seconds = ($outItems | Measure-Object -Property TotalMilliseconds -Sum).Sum
    $ts =  [timespan]::FromMilliseconds($seconds) 
    $AllTime =  ("{0:hh\:mm\:ss\,fff}" -f $ts) 
    $b=[pscustomobject]@{'Timespan' = $AllTime} 



   $excel = New-Object -ComObject Excel.Application
   $excel.visible = $true
   $workbook = $excel.Workbooks.Add()


   $array = ($tt |ConvertTo-MultiArray).Value

   $starta = [int][char]'a' - 1
   if ($array.GetLength(1) -gt 26) {
   $col = [char]([int][math]::Floor($array.GetLength(1)/26) + $starta) + [char]  (($array.GetLength(1)%26) + $Starta)}
 else {
      $col = [char]($array.GetLength(1) + $starta)
 }

  $range = $workbook.ActiveSheet.Range("a1","$col$($array.GetLength(0)+1)")
  $range.Value2 = $array
使用此代码:

       $allMediaFiles = Get-ChildItem -Path C:\Users\User\Documents\ScripsPS1\xip\Testes\*   | % {
   $content = get-content -Path $_ -Raw
   $xml = [xml]$content
 

    [pscustomobject]@{
       video_audio = $xml.XIP.ContentObject.CustomType
       SecurityTag = $xml.XIP.ContentObject.SecurityTag 
       Duration = ($xml.XIP.Generation.Properties.Property | where {$_.PropertyName -eq  "Duration"}).value
      Format = $xml.XIP.Bitstream.Filename -replace ".*\.", ""
   }    
}
我有这个(多亏了马蒂亚斯)

现在我需要这个:

             FileTypes      O         U       L   Duration
             ---------- --------- -------- ------ --------
   video          3                   3                    
   Audio         11                  10       1                                         
   eaf           11          1               10             
   pdf            1                           1         
   mp4            3                   3                 
   WAV           11          2                9          
但我在这方面遇到了一些麻烦:

    $tt =[pscustomobject]@{
    FileTypes = $allMediaFiles | ? {$_.video_audio} | select -ExpandProperty video_audio -Unique
    O_OpenAccess = 'a'  
    U_UserAccess = 'c'
    S_SubscriberAccess = 'd'
    Duration = 'e'
  }
这是我将创建一个excel文件的结果。因此,代码读取一些xml文件,获取所需信息,并在最后使用这些数据创建一个报告:

Ex-我们有多少视频和U_UserAccess securityTag,或者有多少音频和U_UserAccess securityTag
O_OpenAccess等。我计算了许多音频、视频、mp4、waw等。

不是很优雅,但做了以下工作:

$obj = @()
$List1 = ($allMediaFiles | Group-Object "video_audio").Name
ForEach ($item in $List1) {
    $group = ($allMediaFiles | Group-Object "video_audio" | ? {$_.name -eq $item}).Group
    $obj += [pscustomobject]@{
        'name' = $item; 
        'FileTypes' = ($allMediaFiles | Group-Object "video_audio" | ? {$_.name -eq $item}).count; 
        'O' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "O_OpenAccess"}).count; 
        'U' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "U_UserAccess"}).count; 
        'L' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "LOADING_BAY_10"}).count;
        }
    }
$List2 = ($allMediaFiles | Group-Object "Format").Name
ForEach ($item in $List2) {
    $group = ($allMediaFiles | Group-Object "Format" | ? {$_.name -eq $item}).Group
    $obj += [pscustomobject]@{
        'name' = $item; 
        'FileTypes' = ($allMediaFiles | Group-Object "video_audio" | ? {$_.name -eq $item}).count; 
        'O' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "O_OpenAccess"}).count; 
        'U' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "U_UserAccess"}).count; 
        'L' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "LOADING_BAY_10"}).count;
        }
    }
$obj = @()
$List1 = ($allMediaFiles | Group-Object "video_audio").Name
ForEach ($item in $List1) {
    $group = ($allMediaFiles | Group-Object "video_audio" | ? {$_.name -eq $item}).Group
    $obj += [pscustomobject]@{
        'name' = $item; 
        'FileTypes' = ($allMediaFiles | Group-Object "video_audio" | ? {$_.name -eq $item}).count; 
        'O' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "O_OpenAccess"}).count; 
        'U' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "U_UserAccess"}).count; 
        'L' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "LOADING_BAY_10"}).count;
        }
    }
$List2 = ($allMediaFiles | Group-Object "Format").Name
ForEach ($item in $List2) {
    $group = ($allMediaFiles | Group-Object "Format" | ? {$_.name -eq $item}).Group
    $obj += [pscustomobject]@{
        'name' = $item; 
        'FileTypes' = ($allMediaFiles | Group-Object "video_audio" | ? {$_.name -eq $item}).count; 
        'O' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "O_OpenAccess"}).count; 
        'U' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "U_UserAccess"}).count; 
        'L' = ($group | Group-Object "SecurityTag" | ? {$_.Name -eq "LOADING_BAY_10"}).count;
        }
    }