文件夹名称基于数字排序

时间:2017-01-03 11:38:07

标签: batch-file cmd

我想要检索数字顺序最高的文件夹的名称,以便更精确。 所有文件夹都是根据一些randon 6位数命名的。

例如:

如果我有名为

的文件夹
  1. 123456
  2. 234567
  3. 345678
  4. 然后我希望能够使用字符串 345678 分配变量 类似的东西:

    set highestNumber=<code for highest number>
    

1 个答案:

答案 0 :(得分:1)

使用dir command/O选项获取已排序的文件夹列表,使用for /F loop遍历该列表,并通过{{3}将当前项目分配给变量},最终将保留最后一项:

for /F "delims= eol=:" %%D in ('dir /B /A:D /O:N "D:\root\*"') do set "LAST=%%D"
echo(%LAST%

这取决于所有文件夹名称由相同的位数组成的事实。

如果文件夹名称是不具有相同位数的数字,并且您想要最大数字,dir /O:N不起作用,因为它会进行字母排序,10出现在2之前{1}}。所以你需要改变方法 - 这是一个例子(范围02147483647):

setlocal EnableDelayedExpansion
rem // Initialise buffer:
set "GRNUMB="
for /F "delims= eol=:" %%D in ('
    rem/ Filter folders for purely numeric names: ^& ^
    dir /B /A:D "D:\root\*" ^| findstr /R /C:"^0$" /C:"^[1-9][0-9]*$"
') do (
    rem // Do numeric comparison:
    if %%D GTR !GRNUMB! set /A "GRNUMB=%%D"
)
rem // Return result:
echo(%GRNUMB%
endlocal

变量GRNUMB包含构成目前遇到的最大数字的文件夹的名称。只要当前文件夹的名称构成一个更大的数字,GRNUMB就会更新。

如果文件夹名称是不具有相同位数的数字并且也可以以零开头,则需要稍微更改一下代码 - 这是一个示例(最多可以使用5位数字):

setlocal EnableDelayedExpansion
rem // Initialise buffers:
set "GRNAME=" & set /A "GRNUMB=0"
for /F "delims= eol=:" %%D in ('
    rem/ Filter folders for purely numeric names: ^& ^
    dir /B /A:D "D:\root\*" ^| findstr "^[0-9][0-9]*$"
') do (
    rem // Remove leading zeros:
    set "NAME=%%D" & set /A "NUMB=10000%%D, NUMB%%=10000"
    rem // Do numeric comparison:
    if !NUMB! GTR !GRNUMB! set "GRNAME=!NAME!" & set /A "GRNUMB=!NUMB!"
)
rem // Return result:
echo(%GRNAME%
endlocal

变量GRNAME包含构成目前遇到的最大数字的文件夹的名称,GRNUMB保持该数字转换为真正的整数值 1 。只要当前文件夹的名称构成一个更大的数字,GRNAMEGRNUMB都会更新。

1)命令set /A "NUMB=10000%%D, NUMB%%=10000"10000之前,然后将结果除以10000并返回余数;这样做的结果是前导零消失,这会导致set /Aif以无意义的方式将数字解释为八进制整数。