2016-11-18 228 views
0

我正在檢查我的服務器磁盤空間使用情況並生成一個文本文件作爲報告。 我想按照FreePercentage Free%的升序對輸出文件進行排序。如何在PowerShell中對文本文件進行排序

我被困在這個階段。它只是不排序。 它是一個分隔符問題?我的錯誤在哪裏?

# files to be used 
$FileName0 = "C:\MONITORING\WINDOWS-SPACE\SCRIPT\SPACE0.txt" 
$FileName1 = "C:\MONITORING\WINDOWS-SPACE\SCRIPT\SPACE1.txt" 
$FileName2 = "C:\MONITORING\WINDOWS-SPACE\SCRIPT\SPACE2.txt" 

# file containing servers list 
#$ServerName = Get-Content "C:\MONITORING\WINDOWS-SPACE\SCRIPT\COMPUTERS.txt" 

# use 2 servers only for coding test, will be replaced by a file containing all 
# servers 
$ServerName = "SERVER1","SERVER2" 

# loop and process drive-id and calculations and populate filename-0 
foreach ($_ in $ServerName) { 
    Get-WmiObject -Query "Select * from win32_logicaldisk" -ComputerName $_ | 
    Select PSComputername, DeviceID, 
     @{Name="TotalGB"; Expression={"{0:N0}" -F ($_.Size/1GB)}}, 
     @{Name="UsedGB" ; Expression={"{0:N0}" -F (($_.Size/1GB)-($_.Freespace/1GB))}}, 
     @{Name="FreeGB" ; Expression={"{0:N0}" -F ($_.Freespace/1GB)}}, 
     @{Name="Free%" ; Expression={"{0:N0}" -F (($_.Freespace/$_.Size)*100)}} | 
    Format-Table -AutoSize >> $FileName0 
} 

# remove unwanted drives ('A'&'Z') and duplicate lines and empty lines and 
# populate filename-1 
Get-Content $FileName0 | Select-Object -Unique | 
    Where {$_ -notmatch "A:"} | 
    Where {$_ -notmatch "Z:"} | 
    Where { $_ -notmatch "^-" } | 
    Where {$_ -ne ""} | 
    Format-Table -AutoSize > $FileName1 

# input final result into a CSV file filename-2 
Import-Csv $FileName1 -Header PSComputername, TotalGB, UsedGB, FreeGB, Free% | 
    sort [int]Free% | 
    Format-Table -AutoSize >> $FileName2 

實際輸出文件:

PSComputerName DeviceID TotalGB UsedGB FreeGB Free% 
SERVER1  C:  60  33  27  45 
SERVER1  D:  20  2  18  88 
SERVER2  C:  40  27  13  33 
SERVER2  D:  50  6  44  87

所需的輸出文件:

PSComputerName DeviceID TotalGB UsedGB FreeGB Free% 
SERVER2  C:  40  27  13  33 
SERVER1  C:  60  33  27  45 
SERVER2  D:  50  6  44  87 
SERVER1  D:  20  2  18  88

回答

1

這裏有一個較短的方式做你問:

$computerList = "server1","server2" 
$computerList | ForEach-Object { 
    $computerName = $_ 
    $params = @{ 
    "Class" = "Win32_LogicalDisk" 
    "ComputerName" = $computerName 
    "Filter" = "DriveType=3" 
    } 
    Get-WmiObject @params | Select-Object ` 
    @{Name = "ComputerName"; Expression = {$_.__SERVER}}, 
    @{Name = "Drive";  Expression = {$_.DeviceID}}, 
    @{Name = "TotalGB";  Expression = {[Int] ("{0:N0}" -f ($_.Size/1gb)      )}}, 
    @{Name = "UsedGB";  Expression = {[Int] ("{0:N0}" -f (($_.Size/1gb) - ($_.FreeSpace/1gb)))}}, 
    @{Name = "FreeGB";  Expression = {[Int] ("{0:N0}" -f ($_.FreeSpace/1gb)     )}}, 
    @{Name = "FreePercent"; Expression = {[Int] ("{0:N0}" -f (($_.FreeSpace/$_.Size) * 100)  )}} 
} | Sort-Object FreePercent 

的問題,你有嘗試使用formattin g並在創建輸出之前進行排序。確保在嘗試格式化或排序之前輸出所有內容。

+0

我能說什麼?這是完美!非常感謝 !!! – user270488

+0

'FreePercent'是字符串值,所以你需要'Sort-Object {[int] $ _。FreePercent}'以正確的順序得到結果。 –

+0

正確,我注意到在我發佈並更新後將所有值轉換爲'[Int]'。 –

2

Get-WmiObject接受計算機名列表,所以你不需要循環。但是,您的主要問題在於,您通過Format-Table管理WMI結果,將其寫入文件,然後嘗試使用Import-Csv再次讀取,因爲中間文件的格式根本不是CSV。將Get-WmiObject之後的數據排序,然後將寫入文件。

Get-WmiObject -Query 'SELECT * FROM Win32_LogicalDisk' -ComputerName $ServerName | 
    Select PSComputername, DeviceID, 
    @{Name="TotalGB"; Expression={"{0:N0}" -f ($_.Size/1GB)}}, 
    @{Name="UsedGB" ; Expression={"{0:N0}" -f (($_.Size/1GB)-($_.Freespace/1GB))}}, 
    @{Name="FreeGB" ; Expression={"{0:N0}" -f ($_.Freespace/1GB)}}, 
    @{Name="Free%" ; Expression={"{0:N0}" -f (($_.Freespace/$_.Size)*100)}} | 
    Sort-Object {[int]$_.'Free%'} | 
    Format-Table -AutoSize | 
    Set-Content $FileName2 

使用Export-Csv,而不是Format-Table | Set-Content如果你想實際的CSV輸出:

... | Sort-Object [int]$_.Free% | Export-Csv $FileName2 -NoType 
相關問題