如何在PowerShell中对文本文件进行排序

如何在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

我正在检查服务器的磁盘空间使用情况,并生成一个文本文件作为报告。 我想按FreePercentage Free%的升序对输出文件进行排序

我被困在这个阶段。它只是不排序。 这是一个分隔符问题吗?我的错在哪里

# 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*