簡體   English   中英

在Powershell中從哈希表格式化輸出結果

[英]Formatting my output results from a hashtable in powershell

所以這是我的問題,當您使用PowerShell和哈希表格式化輸出時,我確定您已經看過1000遍了。 因此,我編寫了一個腳本,該腳本將從遠程服務器(如HD,MEM,CPU等)收集所有要點。首先,我想說腳本可以正常工作,也就是說,我對輸出到csv的格式存在疑問。 我在尋找的建議是如何幫助我將輸出的每個HD捕獲到自己的列或定界符中,以用於具有多個驅動器以及其他所有功能的系統。

因此,這是我的功能齊全的腳本:

         $OutFile = "$psscriptroot\sys_info.csv"
         $Status = @()
          $HDCAP = @()
        $ArrComputers =  "."  
        #Specify the list of PC names in the line above. "." means local system

        #Clear-Host
          foreach ($Computer in $ArrComputers) 
        {
            $computerSystem = get-wmiobject Win32_ComputerSystem -Computer $Computer 
            $computerBIOS = get-wmiobject Win32_BIOS -Computer $Computer  
            $computerOS = get-wmiobject Win32_OperatingSystem -Computer $Computer 
            $computerCPU = get-wmiobject Win32_Processor -Computer $Computer 
            $computerHDD = Get-WmiObject Win32_LogicalDisk -ComputerName $Computer -Filter drivetype=3 


              $exp =       @{Expression={$_.Server };Label="Computer_Name"},
                           @{Expression={$_.Manufacturer };Label="Manufacturer/Model"},
                           @{Expression={$_.Serial };Label="Serial #"},                   
                           @{Expression={$_.Processor };Label="Processor"},
                           @{Expression={$_.Harddrive};Label="Harddrive"},
                           @{Expression={$_.TotalMemorySize};Label="TotalMemorySize"}, 
                           @{Expression={$_.LastRebootTime};Label="LastRebootTime"} 

        foreach($sys in $computerSystem)
          {
          $mf = $sys | select Manufacturer,Model
          }
         foreach($cs in $computerSystem)
          {

          $mem = $cs | select -Property @{Name = "MemorySize GB" ;   Expression = { $_.TotalPhysicalMemory/1GB –as [int] } }
          }

         foreach($CB in  $computerBIOS)
        {
          $ser = $cb | select SerialNumber
        }
         foreach($CPU in  $computerCPU)
        {
          $PRCR = $CPU | select name
        }
        foreach($HD in $computerHDD)
        {
          $HDCAP += $HD| select -Property DeviceID,
                        @{Name = "SizeGB" ;   Expression = { $_.Size/1GB –as [int] } },
                        @{Name=  "FreeGB";    Expression={[math]::Round($_.Freespace/1GB,2)}}
        }
        foreach($OS in  $computerOS)
        {
          $CPOS = $os | select -Property  @{Name = "LastBootUpTime " ; Expression = {$OS.ConvertToDateTime($OS.LastBootUpTime)}}

        }
        $Status += (@{

         Server          =  $Computer
         Manufacturer    =  $Mf
         Serial          =  $ser      
         Processor       =  $PRCR
         Harddrive       =  $HDCAP 
         TotalMemorySize =  $mem     
         LastRebootTime  =  $CPOS     


                 })

        }




         $Status | select-object $exp 

這是我收到的輸出的副本:

Computer_Name      : .
Manufacturer/Model : @{Manufacturer=Micro-Star International Co., Ltd; Model=MS-0000}
Serial #           : @{SerialNumber=To be filled by O.E.M.}
Processor          : @{name=AMD Ryzen 5 1600 Six-Core Processor            }
Harddrive          : {@{DeviceID=C:; SizeGB=447; FreeGB=158.99}, @{DeviceID=D:; SizeGB=931; FreeGB=473.66}, @{DeviceID=F:; SizeGB=0; FreeGB=0.11}}
TotalMemorySize    : @{MemorySize GB=32}
LastRebootTime     : @{LastBootUpTime =4/10/2018 9:54:16 AM}

所需的輸出看起來像這樣:

Computer_Name,Manufacturer/Model,Serial # ,Processor,Harddrive1, Harddrive 2, Harddrive 3 ,TotalMemorySize ,LastRebootTime

加上沒有所有@符號。

請讓我知道你的想法

嘗試使用Flatten-Object ,它不會為您提供確切的標頭名稱,但是非常接近,您可以隨時考慮對其重命名:

PS C:\> $Status | Flatten | ft

Manufacturer.Manufacturer Manufacturer.Model       Server LastRebootTime.LastBootUpTime  Harddrive.1.DeviceID Harddrive.1.SizeGB Harddrive.1.FreeGB Serial.SerialNumber Processor.name
------------------------- ------------------       ------ ------------------------------ -------------------- ------------------ ------------------ ------------------- --------------
Hewlett-Packard           HP EliteBook Folio 9470m .      2018-04-11 6:11:28 PM          C:                                  221              59.42 PC1234567          Intel(R) Core...

謝謝大家為我提供的支持。 這樣,這就是我決定使用的格式,並且我喜歡收到的輸出:這是使用PScustomObjects的代碼段:

    {   $DiskResults += [pscustomobject][ordered] @{
            Computer = $Computer
            Manufacturer =$mf.Manufacturer
            Model = $mf.Model
            Serial =$ser.SerialNumber
            Memory ="{0:N2}" -f ($mem.TotalPhysicalMemory / 1gb)
            Processor =$PRCR.name
            LastRebootInDays = (($now - 
           ($CPOS.ConverttoDateTime($CPOS.lastbootuptime))).days  )
            Drive = $Disk.DeviceID
            CapacityGB = "{0:N2}" -f ($Disk.Size / 1gb)
            UsedGB = "{0:N2}" -f (($Disk.Size - $Disk.FreeSpace) / 1gb)
            UsedPercent = "{0:P0}" -f (($Disk.Size - $Disk.FreeSpace) / 
            $Disk.Size)
            FreeGB = "{0:N2}" -f ($Disk.FreeSpace / 1gb)
            FreePercent = "{0:P0}" -f ($Disk.FreeSpace / $Disk.Size)
            VolumeName = $Disk.VolumeName
        }

這是我的結果的圖片:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM