2015-03-30 48 views
-2

我已經編寫了以下PowerShell腳本來獲取我們環境中服務器的磁盤空間信息。這裏使用Powershell的總和列

$servers = Get-Content E:\POC.txt 
$array = @() 
foreach($server in $servers){ 
    $sysinfo = Get-WmiObject Win32_Volume -ComputerName $server 
    for($i = 0;$i -lt $sysinfo.Count; $i++){ 
     $sname = $sysinfo[$i].SystemName 
     $servername = $server 
     $label = $sysinfo[$i].Label 
     if(($label) -and (!($label.Contains("FILLER")))){ 
      write-host "Processing $label from $server" 
      $name = $sysinfo[$i].Name 
      $capacity = [math]::round(($sysinfo[$i].Capacity/1GB),2) 
      $fspace = [math]::round(($sysinfo[$i].FreeSpace/1GB),2) 
      $sused = [math]::round((($sysinfo[$i].Capacity - $sysinfo[$i].FreeSpace)/1GB),2) 
      $fspacepercent = [math]::Round((($sysinfo[$i].FreeSpace*100)/$sysinfo[$i].Capacity),2) 
      $obj = New-Object PSObject 
      $obj | Add-Member -MemberType NoteProperty -Name "SystemName" -Value $sname 
      $obj | Add-Member -MemberType NoteProperty -Name "ServerName" -Value $server 
      $obj | Add-Member -MemberType NoteProperty -Name "Label" -Value $label 
      $obj | Add-Member -MemberType NoteProperty -Name "Name" -Value $name 
      $obj | Add-Member -MemberType NoteProperty -Name "Capacity(GB)" -Value $capacity 
      $obj | Add-Member -MemberType NoteProperty -Name "FreeSpace(GB)" -Value $fspace 
      $obj | Add-Member -MemberType NoteProperty -Name "Used(GB)" -Value $sused 
      $obj | Add-Member -MemberType NoteProperty -Name "FreeSpace%" -Value $fspacepercent 
      $array += $obj 
     } 
    } 
    $array += write-output " " 
    $totalSize = ($array | Measure-Object 'Capacity(GB)' -Sum).Sum 
    $array += $totalsize 
    $array += write-output " " 
} 
$filename = "E:\VolumeReport.csv" 
$array | Export-CSV $filename -NoTypeInformation 

一個額外的要求是獲得容量,尺寸和可用空間爲每個服務器列的總和。我嘗試使用Measure-Object,但沒有成功。 這裏沒有輸出值。只是空白。請仔細查看此信息並提供協助。

+0

這只是總計不起作用嗎?你打算如何將它包含在csv中? – Matt 2015-03-30 20:42:44

+0

你需要在PowerShell v2上運行它嗎?你正在做非常冗長的Add-Member方法來解決這個問題,使用v3和up方法可能會更簡單和更短。 – FoxDeploy 2015-03-30 20:44:45

+0

@Matt:只是總計不起作用。我剛剛修改了計算總計的代碼。 – user2068804 2015-03-30 20:51:57

回答

1

讓我們試試這個尺寸。這裏的問題的

$servers = Get-Content E:\POC.txt 
$propertyOrdered = "SystemName","ServerName","Label","Name","Capacity(GB)","FreeSpace(GB)","Used(GB)","FreeSpace%" 
$filename = "C:\temp\VolumeReport.csv" 
('"{0}"' -f ($propertyOrdered -join '","')) | Set-Content $filename 

foreach($server in $servers){ 
    $sysinfo = Get-WmiObject Win32_Volume -ComputerName $server 
    $serverDetails = @() 

    for($i = 0;$i -lt $sysinfo.Count; $i++){ 
     $sname = $sysinfo[$i].SystemName 
     $servername = $server 
     $label = $sysinfo[$i].Label 
     if(($label) -and (!($label.Contains("FILLER")))){ 
      write-host "Processing $label from $server" 
      $name = $sysinfo[$i].Name 
      $capacity = [math]::round(($sysinfo[$i].Capacity/1GB),2) 
      $fspace = [math]::round(($sysinfo[$i].FreeSpace/1GB),2) 
      $sused = [math]::round((($sysinfo[$i].Capacity - $sysinfo[$i].FreeSpace)/1GB),2) 
      $fspacepercent = [math]::Round((($sysinfo[$i].FreeSpace*100)/$sysinfo[$i].Capacity),2) 
      $props = @{ 
       "SystemName" = $sname 
       "ServerName" = $server 
       "Label" = $label 
       "Name" = $name 
       "Capacity(GB)" = $capacity 
       "FreeSpace(GB)" = $fspace 
       "Used(GB)" = $sused 
       "FreeSpace%" = $fspacepercent 
      } 
      # Build this server object. 
      $serverDetails += New-Object PSObject -Property $props 
     } 
    } 

    # Output current details to file. 
    $serverDetails | Select $propertyOrdered | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Add-Content $filename 
    #Calculate Totals and append to file. 
    $totals = '"","","","Totals",{0},{1},{2},""' -f ($serverDetails | Measure-Object -Property "Capacity(GB)" -Sum).Sum, 
     ($serverDetails | Measure-Object -Property "FreeSpace(GB)" -Sum).Sum, 
     ($serverDetails | Measure-Object -Property "Used(GB)" -Sum).Sum 
    $totals | Add-Content $filename 
} 

部分原因是,你是混合物體輸出,並且最有可能會一直抱着你回來靜態字符串輸出。我以一種應該符合2.0的方式整理對象生成。不是說你要去哪裏是錯誤的,但是這樣看起來有點令人愉快,那麼所有的Add-Member s

我刪除$array因爲它沒有地方了,因爲這裏的邏輯是不斷地輸出數據到輸出文件應該暫時存儲它。

對於每個$server,我們在變量$serverDetails中構建一組磁盤信息。一旦所有的磁盤已經被計算出來(使用你的公式),然後我們創建一個總計線。你真的不清楚你的輸出是怎麼樣的,所以我猜對了。上面的代碼應該像下面這樣淨輸出。 (它在Excel或csv知道的閱讀器中看起來好多了。)

"SystemName","ServerName","Label","Name","Capacity(GB)","FreeSpace(GB)","Used(GB)","FreeSpace%" 
"server01","server01","System Reserved","\\?\Volume{24dbe945-3ea6-11e0-afbd-806e6f6e6963}\","0.1","0.07","0.03","71.85" 
"","","","Totals",0.1,0.07,0.03,"" 
"server02","server02","System Reserved","\\?\Volume{24dbe945-3ea6-11e0-afbd-806e6f6e6963}\","0.1","0.07","0.03","69.27" 
"server02","server02","images","I:\","1953.12","152.1","1801.02","7.79" 
"server02","server02","Data","E:\","79.76","34.59","45.18","43.36" 
"","","","Totals",2032.98,186.76,1846.23,"" 
+0

請查看我修改的計算總計的代碼。 – user2068804 2015-03-30 20:54:40

+0

我需要總計來計算每個服務器,而不是所有的服務器一次。根據你的建議,它會計算txt文件中提到的所有服務器的所有總數。請仔細研究並相應地提出編輯。在嘗試你的代碼之後,仍然沒有總數輸出到CSV文件。只是空白。沒有別的 – user2068804 2015-03-30 21:00:42

+0

好的抱歉,我誤解了。爲此需要更重大的改變。沒有問題我們可以解決這個問題 – Matt 2015-03-30 21:14:48