使用powershell查找文件名中编号最高的文件
对不起,伙计们,我是新来的。如果有人在以下情况下提供帮助,那就太好了: 我在文件夹c:\test中有几个文件使用powershell查找文件名中编号最高的文件,powershell,powershell-3.0,Powershell,Powershell 3.0,对不起,伙计们,我是新来的。如果有人在以下情况下提供帮助,那就太好了: 我在文件夹c:\test中有几个文件 sample.x.x.1 sample.x.x.2 sample.x.x.3 sample.x.x.4 sample.x.x.5 我想找到给定文件夹中名称中数字最大的文件名。在上面的示例中,5是最大的数字,脚本应将输出文件名返回为sample.x.x.5 提前谢谢 用数字对文件名进行排序是一个相当大的问题,因为有两种方法。第一个将它们设置为字母顺序。也就是说,0,1,11,111,2,
sample.x.x.1
sample.x.x.2
sample.x.x.3
sample.x.x.4
sample.x.x.5
我想找到给定文件夹中名称中数字最大的文件名。在上面的示例中,5是最大的数字,脚本应将输出文件名返回为sample.x.x.5
提前谢谢 用数字对文件名进行排序是一个相当大的问题,因为有两种方法。第一个将它们设置为字母顺序。也就是说,
0,1,11,111,2,
第二个使用自然顺序。也就是说,0,1,2,11111…
。这是一个令人惊讶的棘手问题,大约每三分之一的程序员对此感到困惑
已经有一个,我会这样说
# Create files 1..5
for($i=1;$i -le 5; ++$i) { set-content sample.x.x.$i -Value $null }
# Tricksy! Create file .10 to confuse asciibetic/natural sorting
set-content sample.x.x.10 -Value $null
ls # Let's see the files
Directory: C:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2015-09-28 10:29 0 sample.x.x.1
-a---- 2015-09-28 10:29 0 sample.x.x.10
-a---- 2015-09-28 10:29 0 sample.x.x.2
-a---- 2015-09-28 10:29 0 sample.x.x.3
-a---- 2015-09-28 10:29 0 sample.x.x.4
-a---- 2015-09-28 10:29 0 sample.x.x.5
# Define helper as per linked answer
$ToNatural = { [regex]::Replace($_, '\d+$', { $args[0].Value.PadLeft20) }) }
# Sort with helper and check the output is natural result
gci | sort $ToNatural -Descending | select -First 1
Directory: C:\temp\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2015-09-28 10:29 0 sample.x.x.10
按字母顺序排序
PS C:\Users\Gebb> @("sample.x.x.1", "sample.x.x.5", "sample.x.x.11") | sort
sample.x.x.1
sample.x.x.11
sample.x.x.5
PS C:\Users\Gebb> @("sample.x.x.1", "sample.x.x.5", "sample.x.x.11") |
sort -Property @{Expression={[Int32]($_ -split '\.' | select -Last 1)}}
sample.x.x.1
sample.x.x.5
sample.x.x.11
数字排序
PS C:\Users\Gebb> @("sample.x.x.1", "sample.x.x.5", "sample.x.x.11") | sort
sample.x.x.1
sample.x.x.11
sample.x.x.5
PS C:\Users\Gebb> @("sample.x.x.1", "sample.x.x.5", "sample.x.x.11") |
sort -Property @{Expression={[Int32]($_ -split '\.' | select -Last 1)}}
sample.x.x.1
sample.x.x.5
sample.x.x.11
最大数量
PS C:\Users\Gebb> @("sample.x.x.1", "sample.x.x.5", "sample.x.x.11") |
sort -Property @{Expression={[Int32]($_ -split '\.' | select -Last 1)}} |
select -Last 1
sample.x.x.11
可能值得注意的是,ascibit/数值排序问题是由输入对象的类型引起的。如果您知道要对哪个子字符串进行排序,则可以将其转换为数字类型:
sort{$\子字符串($\ LastIndexOf('.')+1)-as[int]}