如何在PowerShell中对文本文件进行排序
我正在检查服务器的磁盘空间使用情况,并生成一个文本文件作为报告。 我想按FreePercentage Free%的升序对输出文件进行排序 我被困在这个阶段。它只是不排序。 这是一个分隔符问题吗?我的错在哪里如何在PowerShell中对文本文件进行排序,powershell,Powershell,我正在检查服务器的磁盘空间使用情况,并生成一个文本文件作为报告。 我想按FreePercentage Free%的升序对输出文件进行排序 我被困在这个阶段。它只是不排序。 这是一个分隔符问题吗?我的错在哪里 # files to be used $FileName0 = "C:\MONITORING\WINDOWS-SPACE\SCRIPT\SPACE0.txt" $FileName1 = "C:\MONITORING\WINDOWS-SPACE\SCRIPT\SPACE1.txt" $File
# 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
PSComputerName设备ID TotalGB UsedGB FreeGB Free%
服务器1C:60 33 27 45
伺服器1 D:20 2 18 88
服务器2C:40271333
伺服器2d:5064487
所需的输出文件:
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
PSComputerName设备ID TotalGB UsedGB FreeGB Free%
服务器2C:40271333
服务器1C:60 33 27 45
伺服器2d:5064487
Server1d:20 2 18 88这里有一个简短的方法来满足您的要求:
$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
您遇到的问题是在创建输出之前尝试使用格式化和排序。在尝试格式化或排序之前,请确保输出所有内容。这里有一个简短的方法来完成您的要求:
$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
您遇到的问题是在创建输出之前尝试使用格式化和排序。在尝试格式化或排序之前,请确保输出所有内容。
获取WmiObject
接受计算机名称列表,因此不需要循环。不过,您的主要问题是,通过格式表
传递WMI结果,将其写入文件,然后在中间文件的格式根本不是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
如果需要实际Csv输出,请使用导出Csv
而不是格式化表格|设置内容
:
... | Sort-Object [int]$_.Free% | Export-Csv $FileName2 -NoType
Get WmiObject
接受计算机名列表,因此不需要循环。不过,您的主要问题是,通过格式表
传递WMI结果,将其写入文件,然后在中间文件的格式根本不是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
如果需要实际Csv输出,请使用导出Csv
而不是格式化表格|设置内容
:
... | Sort-Object [int]$_.Free% | Export-Csv $FileName2 -NoType
freeepercent
是字符串值,因此您需要Sort Object{[int]$..freeepercent}
以正确的顺序获得结果。正确的,我注意到在我发布并更新后将所有值强制转换为[int]
*cough*[int]($..Size/1gb)
*cough*freeepercent
是字符串值,因此,您需要排序对象{[int]$\u0.freeepercent}
才能以正确的顺序获得结果。正确,我注意到在发布并更新后,我将所有值强制转换为[int]
*cough*[int]($.Size/1gb)
*cough*