使用 CUSTOMPSOBJECT 对输出进行排序并按变量对输出进行排序

问题描述 投票:0回答:1

我试图通过 $servername 变量对每日服务器报告的输出进行排序,但是,我无法对输出进行排序。我认为它需要某种数组或选择对象字符串。有人可以指出我正确的方向吗?

此外,如果有一种方法可以用空行分隔每个新的 $servername,那就太棒了!

  • 添加了完整脚本以便更好地理解

      Import-Module ActiveDirectory
    

    $server = (Get-ADComputer -SearchBase "搜索库" -filter *).name

    $脚本块={

      # Set the server name
      $serverName = $env:COMPUTERNAME
    
      # Get the up/down status of the server
      $pingResult = Test-Connection -ComputerName $server.Name -Count 1 -ErrorAction SilentlyContinue
      $status = if ($pingResult.StatusCode -eq 1) {
          'Up'
      }
      else {
          'Down'
      }
    
      # Get the server build date
      $buildDate = (Get-CimInstance -Class Win32_OperatingSystem).InstallDate
    
      # Certificate name information
      $certname = get-childitem -path Cert:\LocalMachine\My\ |
          Select friendlyname 
    
      # Get the server certificate validity
      [array] $certs = Get-ChildItem -Path Cert:\LocalMachine\My |
          Where-Object { -Not $_.PSIsContainer } |
          Sort-Object -Property NotBefore        
    
      #Number of Certs on Machine
      $certcount = (get-childitem -path Cert:\LocalMachine\my).count
    
      # Check Trellix update
      $TrellixDate = [datetime](Get-ItemProperty 'C:\Program Files\Common Files\McAfee\Engine\AMCoreUpdater\amupdate.dat').LastWriteTime.DateTime
    
      # Operating system collection
      $os = Get-CimInstance Win32_OperatingSystem | Select-Object Caption
    
      # Disk information
      [array] $diskInfo = Get-CimInstance -Class Win32_LogicalDisk -Filter 'DriveType = 3'
    
      for ($i = 0; $i -lt [System.Math]::Max($cert.Count, $diskInfo.Count); $i++) {
          $disk = $diskInfo[$i]
          $freeSpace = $diskSize = $percent = $label = $null
    
          $cert = $certs[$i]
    
          if ($disk) {
              $label = $disk.DeviceID
              $freeSpace = $disk.FreeSpace / 1GB
              $diskSize = $disk.Size / 1GB
              $percent = '{0:P0}' -f ($freeSpace / $diskSize)
          }
    
          $validTo = $validFrom = $null
          if ($cert) {
              $validTo = $cert.NotAfter
              $validFrom = $cert.NotBefore
          }
    
        #SQL Version
         if (test-path 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server' -ErrorAction SilentlyContinue){
         $sql = (get-itemproperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server').InstalledInstances
          foreach ($i in $sql) 
          {
          $sqlver = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL').$i
          (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\$p\Setup").Version
          }
         }
         else {$sqlver = "n/a"}
    

    #IIS 版本(如果有) if (Get-Service -Name W3SVC -ErrorAction SilentlyContinue){ $IIS = (Get-ItemProperty -PATH 'HKLM:\SOFTWARE\Microsoft\InetStp').VERSIONSTRING } 否则 {$iis = "n/a"}

    #描述输出列 [PS自定义对象]@{ 服务器名称 = $服务器名称 状态 = $状态 操作系统=$os 构建日期 = '{0:u}' -f $buildDate 证书名称 = $证书名称 证书创建 = $validFrom 证书过期 = $validTo 证书计数 = $证书计数 TrellixLastUpdate = $TrellixDate SQL版本 = $sqlver IIS 版本 = $IIS 磁盘标签 = $标签 可用空间 = '{0:N2} Gb' -f $freespace 磁盘大小 = '{0:N2} Gb' -f $disksize 免费百分比 = $百分比

                      }
      foreach ($serverName in 'PSCustomObject') { $obj | where-object {$_.Servername -eq $servername} | Sort-Object $servername }
      #foreach ($serverName in 'PSCustomObject') { $obj | where-object {$_.Servername -eq $servername} | Sort-Object $servername }
      }
    

    }

    #在服务器上运行脚本的命令

    Invoke-Command -ComputerName $server -ScriptBlock $scriptblock -HideComputerName -ErrorAction SilentlyContinue| 选择对象 * -ExcludeProperty RunspaceId、PSComputerName、PSShowComputerName | #Export-CSV e: ctivetasks\server_checks\DailyServerReport.csv -NoTypeInformation -force 导出-CSV c:\Nec\DailyServerReport1.csv -NoTypeInformation -force

powershell csv scripting
1个回答
0
投票

我想说一个简单的

$ArrayList | Sort-Object -Property ServerName | Format-Table
,其中
$ArrayList
是一个
[System.Collections.ArrayList]
(大多数时候比常规数组更好)包含各种
[PSCustomObject]
的变量应该可以解决问题。

您甚至可能不需要行与行之间的空格。

© www.soinside.com 2019 - 2024. All rights reserved.