2016-11-18 2 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 принимает список вычислительных машин, поэтому вам не нужен цикл. Основная проблема заключается в том, что вы передаете результат WMI через Format-Table, записываете его в файл и затем пытаетесь прочитать его снова с 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