选择最高编号文件 - 批处理文件

Dan*_*row 8 windows batch-file

我有一个充满.jar文件的目录,逐渐命名为:

 version-1.jar
 version-2.jar
 version-3.jar
Run Code Online (Sandbox Code Playgroud)

我想选择编号最大的文件.有没有真正简单的方法呢?因为做错.\version*.jar会导致错误,可能是由于多个文件?

Joe*_*oey 13

我们需要延迟扩张

setlocal enabledelayedexpansion
Run Code Online (Sandbox Code Playgroud)

只是最大的变量:

set max=0
Run Code Online (Sandbox Code Playgroud)

然后迭代文件:

for %%x in (version-*.jar) do (
Run Code Online (Sandbox Code Playgroud)

我们需要没有扩展名的文件名

  set "FN=%%~nx"
Run Code Online (Sandbox Code Playgroud)

version-从头开始删除:

  set "FN=!FN:version-=!"
Run Code Online (Sandbox Code Playgroud)

现在FN应该只包含数字,我们可以比较:

  if !FN! GTR !max! set max=!FN!
)
Run Code Online (Sandbox Code Playgroud)

我们完成了:

echo highest version: version-%max%.jar
Run Code Online (Sandbox Code Playgroud)

完整的批处理文件:

@echo off
setlocal enabledelayedexpansion
set max=0
for %%x in (version-*.jar) do (
  set "FN=%%~nx"
  set "FN=!FN:version-=!"
  if !FN! GTR !max! set max=!FN!
)
echo highest version: version-%max%.jar
Run Code Online (Sandbox Code Playgroud)

  • 问题是数字可能比一个数字长,然后任何天真的排序都会崩溃. (2认同)

dbe*_*ham 5

这是比Joey的代码稍微简单的版本。

@echo off
setlocal enableDelayedExpansion
set max=0
for /f "tokens=1* delims=-.0" %%A in ('dir /b /a-d version-*.jar') do if %%B gtr !max! set max=%%B
echo higest version: version-%max%.jar
Run Code Online (Sandbox Code Playgroud)

只要版本号从不为0(零),即使版本号以零为前缀,此代码也将起作用。指定令牌= 1 *,其中包含0作为定界符会导致从版本号中删除前导零,同时保留第一个非零数字之后的所有零。

如果所有版本的前缀都为零,则宽度是一个更简单的解决方案。但是,此解决方案无论有无零前缀都可以使用。

如果存在前导零,则Joey的代码将失败,因为这表示八进制表示法。带有前导零的无效八进制数字将被视为字符串,导致比较得出错误的结果。这可能不是问题,因为原始问题意味着前导零不存在。但要安全起见,总比后悔好。