当我运行以下代码时:
'Windows Embedded Standard',
'Windows 7 Enterprise',
'Windows XP Professional',
'Windows Server 2003',
'Windows 7 Entreprise',
'',
'Windows 7 Professionnel',
'Windows 7 Professional',
'Windows 10 Enterprise',
'Windows Server 2008 R2 Standard',
'Windows Server 2012 Standard',
'Windows Server 2012 R2 Standard',
'unknown',
'Windows Server 2008 R2 Enterprise' | Sort-Object
分类如下:
unknown
Windows 10 Enterprise
Windows 7 Enterprise
Windows 7 Professional
Windows 7 Professionnel
Windows Embedded Standard
Windows Server 2003
Windows Server 2008 R2 Enterprise
Windows Server 2008 R2 Standard
Windows Server 2012 R2 Standard
Windows Server 2012 Standard
Windows XP Professional
Windows 7 Entreprise
我无法弄清楚为什么最后一个条目Windows 7 Entreprise
没有正确排序。它应该排在第4位。我在这里缺少什么?
更新
感谢评论,很明显源数据似乎是问题所在:
$Computers = Get-ADComputer -SearchBase 'OU=EU,DC=domain,DC=net' -Filter * -Properties OperatingSystem
$Computers | Group-Object OperatingSystem | Sort-Object Name | Select-Object Count, Name | Format-Table -AutoSize
ANSI值:
$Computers | Group-Object OperatingSystem | ForEach-Object{$_.Name;[int[]][char[]]$_.Name -join "|"}
Windows Server 2008 R2 Standard
87|105|110|100|111|119|115|32|83|101|114|118|101|114|32|50|48|48|56|32|82|50|32|83|116|97|110|100|97|114|100
Windows Server 2003
87|105|110|100|111|119|115|32|83|101|114|118|101|114|32|50|48|48|51
Windows Server 2012 Standard
87|105|110|100|111|119|115|32|83|101|114|118|101|114|32|50|48|49|50|32|83|116|97|110|100|97|114|100
Windows Server 2012 R2 Standard
87|105|110|100|111|119|115|32|83|101|114|118|101|114|32|50|48|49|50|32|82|50|32|83|116|97|110|100|97|114|100
unknown
117|110|107|110|111|119|110
Windows Server 2008 R2 Enterprise
87|105|110|100|111|119|115|32|83|101|114|118|101|114|32|50|48|48|56|32|82|50|32|69|110|116|101|114|112|114|105|115|101
Windows 7 Enterprise
87|105|110|100|111|119|115|32|55|32|69|110|116|101|114|112|114|105|115|101
Windows 7 Entreprise
87|105|110|100|111|119|115|160|55|32|69|110|116|114|101|112|114|105|115|101
Windows 7 Professionnel
87|105|110|100|111|119|115|32|55|32|80|114|111|102|101|115|115|105|111|110|110|101|108
Windows XP Professional
87|105|110|100|111|119|115|32|88|80|32|80|114|111|102|101|115|115|105|111|110|97|108
Windows 7 Professional
87|105|110|100|111|119|115|32|55|32|80|114|111|102|101|115|115|105|111|110|97|108
Windows 10 Enterprise
87|105|110|100|111|119|115|32|49|48|32|69|110|116|101|114|112|114|105|115|101
Windows Embedded Standard
87|105|110|100|111|119|115|32|69|109|98|101|100|100|101|100|32|83|116|97|110|100|97|114|100
有没有办法对它进行不同的编码,以便PowerShell可以正确排序?
答案 0 :(得分:3)
将String.Normalize()
函数与规范化表格KC或KD(documented here)一起使用:
$Computers = Get-ADComputer -SearchBase 'OU=EU,DC=domain,DC=net' -Filter * -Properties OperatingSystem
$OSList = $Computers | Select-Object -ExpandProperty OperatingSystem | ForEach-Object {
$_.ToString().Normalize([Text.NormalizationForm]::FormKC)
}
请注意,Normalize
函数将是远程变音符号,例如重音和坟墓。例如,á将是 a 。为了将字符160转换为字符32,我不得不使用一种使用“完全兼容性分解”的规范化形式,它是KC或KD形式。
答案 1 :(得分:1)
所以我有一个解决这个问题的方法,但是我想要更多的黑客攻击。您的环境中有法语操作系统。基于某些系统的拼写,这很明显。根据您对此数据所做的操作,如果您需要按操作系统进行分组,则无论如何都要按此操作,因为语言之间的拼写不同。
查看Ansi代码,您在违规项目上看到的空间是160,高于32的自然空间。
据说你可以在自定义属性上| Sort-Object {$_ -replace [char]160," "}
来获得你想要的结果。
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
即使在屏幕上正确显示字符,也不会按照您想要的方式对其进行排序。鉴于提供的数据,我认为这个解决方案是必需的。我还没有任何提供多语言环境的经验和其他想法。
答案 2 :(得分:1)
有趣的问题是,用数字排序字符串总是很棘手,因为ASCII /序数值将具有" 1"少于" 7",所以它将比较" Windows 10"低于" Windows 7"。
搜索" PowerShell自定义排序"让我在这个页面上给出答案:custom sorting in powershell。
我使用该方法作为编写以下解决方案的基础。
代码
$items = @(
'Windows Embedded Standard',
'Windows 7 Enterprise',
'Windows XP Professional',
'Windows Server 2003',
'Windows 7 Entreprise',
'',
'Windows 7 Professionnel',
'Windows 7 Professional',
'Windows 10 Enterprise',
'Windows Server 2008 R2 Standard',
'Windows Server 2012 Standard',
'Windows Server 2012 R2 Standard',
'unknown',
'Windows Server 2008 R2 Enterprise')
# Define our search criteria
# match non-digits
$part1 = { if ($_ -match '(\D+)') { $matches[1] } }
# after part 1, match digits and cast to int so sorting works by number/value
$part2 = { if ($_ -match '\D+(\d+)') { [int]$matches[1] } }
# rest of string after part 2
$part3 = { if ($_ -match '\D+\d+(.*)') { $matches[1] } }
Write-Output "`nTest of our parts and how they parse a string."
# write values out surrounded by single quotes so we see exactly what is returned
'Windows 10 Enterprise' | % $part1 | % {Write-Output $("'" + $_ + "'")}
'Windows 10 Enterprise' | % $part2 | % {Write-Output $("'" + $_ + "'")}
'Windows 10 Enterprise' | % $part3 | % {Write-Output $("'" + $_ + "'")}
Write-Output "`nSorted by string (where 1 is less than 7, even if number is 10"
$items | Sort-Object | % {Write-Output $("'" + $_ + "'")}
Write-Output "`nSorted using our custom parsing rules!!!"
# write values out surrounded by single quotes so we see exactly what is returned
$items | Sort-Object $part1, $part2, $part3 | % {Write-Output $("'" + $_ + "'")}
<强>输出:强>
Test of our parts and how they parse a string.
'Windows '
'10'
' Enterprise'
Sorted by string (where 1 is less than 7, even if number is 10
''
'unknown'
'Windows 10 Enterprise'
'Windows 7 Enterprise'
'Windows 7 Entreprise'
'Windows 7 Professional'
'Windows 7 Professionnel'
'Windows Embedded Standard'
'Windows Server 2003'
'Windows Server 2008 R2 Enterprise'
'Windows Server 2008 R2 Standard'
'Windows Server 2012 R2 Standard'
'Windows Server 2012 Standard'
'Windows XP Professional'
Sorted using our custom parsing rules!!!
''
'unknown'
'Windows 7 Enterprise'
'Windows 7 Entreprise'
'Windows 7 Professional'
'Windows 7 Professionnel'
'Windows 10 Enterprise'
'Windows Embedded Standard'
'Windows Server 2003'
'Windows Server 2008 R2 Enterprise'
'Windows Server 2008 R2 Standard'
'Windows Server 2012 R2 Standard'
'Windows Server 2012 Standard'
'Windows XP Professional'
答案 3 :(得分:0)
-Properties
参数不仅显示指定的属性,而是将它们添加到标准集中。因此,正在运行Get-ADComputer -Filter "name -like '*'" -Properties OperatingSystem
我不会仅获得OperatingSystem
属性,但所有这些:DistinguishedName, DNSHostName, Enabled, Name, ObjectClass, ObjectGUID, OperatingSystem, SamAccountName, SID, UserPrincipalName
。
现在你运行这样的东西:
Get-ADComputer -Filter "name -like '*'" -Properties OperatingSystem | sort | select OperatingSystem
这意味着您按DistinguishedName排序,然后选择OperatingSystem。
使用| Sort-Object OperatingSystem
,您就可以了。