PowerShell:排序对象降序错误顺序
PowerShell: Sort-Object descending wrong order
我们目前有以下文件夹结构:
C:\Packages\Adobe\DC.2.2
C:\Packages\Adobe\DC.0.3
C:\Packages\Adobe\DC.0.8
C:\Packages\Microsoft\Edge.1.10
C:\Packages\Microsoft\Edge.1.18
C:\Packages\Microsoft\Edge.1.20
使用 PowerShell 脚本,我尝试只保留相应应用程序文件夹的最高版本,并删除所有其他版本。结果应该是:
C:\Packages\Adobe\DC.0.8
C:\Packages\Microsoft\Edge.1.20
但是,排序在我的脚本中似乎无法正常工作。
$folders_root = Get-ChildItem -Path C:\Packages -Directory
foreach ($folder in $folders_root)
{
$folders_appilcation = Get-ChildItem $folder.FullName -Directory
foreach ($app_folder in $folders_appilcation)
{
$versionfolder = Get-ChildItem $app_folder.FullName -Directory | Sort-Object -Descending | Select-Object -Skip 1 | % {Write-host "Deleting $($_.FullName)"<#; Remove-Item $_.FullName#>}
}
}
对于路径“C:\Packages\Adobe\DC”9.2.2 被认为是最高版本(根据脚本)但它应该是 10.0.8。
Deleting C:\Packages\Adobe\DC.0.8
Deleting C:\Packages\Adobe\DC.0.3
Deleting C:\Packages\Microsoft\Edge.1.18
Deleting C:\Packages\Microsoft\Edge.1.10
谁能告诉我我做错了什么?
排序是比较字符串而不是数字。当您比较字符串 10 和 9 时,它会将 10 解释为 1。
强制将其排序为版本,尝试类似的操作:
sort {[version]::Parse(($_.split("\"))[-1])} -Descending
谢谢。以下代码完美运行:
$folders_root = Get-ChildItem -Path \hkt-cmgmt01a\d$\Empirum\Configurator\Packages -Directory
foreach ($folder in $folders_root)
{
$folders_appilcation = Get-ChildItem $folder.FullName -Directory
foreach ($app_folder in $folders_appilcation)
{
$versionfolder = Get-ChildItem $app_folder.FullName -Directory | Sort-Object { [version] $_.Name } -Descending -ErrorAction SilentlyContinue| Select-Object -Skip 1 | % {Write-host "Deleting $($_.FullName)"<#; Remove-Item $_.FullName#>}
}
}
我们目前有以下文件夹结构:
C:\Packages\Adobe\DC.2.2
C:\Packages\Adobe\DC.0.3
C:\Packages\Adobe\DC.0.8
C:\Packages\Microsoft\Edge.1.10
C:\Packages\Microsoft\Edge.1.18
C:\Packages\Microsoft\Edge.1.20
使用 PowerShell 脚本,我尝试只保留相应应用程序文件夹的最高版本,并删除所有其他版本。结果应该是:
C:\Packages\Adobe\DC.0.8
C:\Packages\Microsoft\Edge.1.20
但是,排序在我的脚本中似乎无法正常工作。
$folders_root = Get-ChildItem -Path C:\Packages -Directory
foreach ($folder in $folders_root)
{
$folders_appilcation = Get-ChildItem $folder.FullName -Directory
foreach ($app_folder in $folders_appilcation)
{
$versionfolder = Get-ChildItem $app_folder.FullName -Directory | Sort-Object -Descending | Select-Object -Skip 1 | % {Write-host "Deleting $($_.FullName)"<#; Remove-Item $_.FullName#>}
}
}
对于路径“C:\Packages\Adobe\DC”9.2.2 被认为是最高版本(根据脚本)但它应该是 10.0.8。
Deleting C:\Packages\Adobe\DC.0.8
Deleting C:\Packages\Adobe\DC.0.3
Deleting C:\Packages\Microsoft\Edge.1.18
Deleting C:\Packages\Microsoft\Edge.1.10
谁能告诉我我做错了什么?
排序是比较字符串而不是数字。当您比较字符串 10 和 9 时,它会将 10 解释为 1。
强制将其排序为版本,尝试类似的操作:
sort {[version]::Parse(($_.split("\"))[-1])} -Descending
谢谢。以下代码完美运行:
$folders_root = Get-ChildItem -Path \hkt-cmgmt01a\d$\Empirum\Configurator\Packages -Directory
foreach ($folder in $folders_root)
{
$folders_appilcation = Get-ChildItem $folder.FullName -Directory
foreach ($app_folder in $folders_appilcation)
{
$versionfolder = Get-ChildItem $app_folder.FullName -Directory | Sort-Object { [version] $_.Name } -Descending -ErrorAction SilentlyContinue| Select-Object -Skip 1 | % {Write-host "Deleting $($_.FullName)"<#; Remove-Item $_.FullName#>}
}
}