我有一个目录充满.jar文件,逐步命名就像这样:选择编号最高的文件 - 批处理文件
version-1.jar
version-2.jar
version-3.jar
我试图选择最高编号的文件。有没有真正简单的方法来做到这一点? 因为做.\version*.jar
会导致错误,可能是由于多个文件?
我有一个目录充满.jar文件,逐步命名就像这样:选择编号最高的文件 - 批处理文件
version-1.jar
version-2.jar
version-3.jar
我试图选择最高编号的文件。有没有真正简单的方法来做到这一点? 因为做.\version*.jar
会导致错误,可能是由于多个文件?
我们需要延迟扩展
只为最大的变量:
set max=0
然后在文件迭代:
for %%x in (version-*.jar) do (
我们需要的文件名不带扩展
set "FN=%%~nx"
并从开始version-
:
set "FN=!FN:version-=!"
现在FN
应该只包含的号码,我们可以比较一下:
if !FN! GTR !max! set max=!FN!
)
,我们就大功告成了:
echo highest version: version-%max%.jar
完整的批处理文件:
@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
这是一个比乔伊的代码稍微简单的版本。
@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
只要版本号从不为0(零),即使版本号为前缀0,此代码也能正常工作。指定令牌= 1 *,将0作为分隔符包含在内,导致前导零从版本号中除去,同时在第一个非零数字后面保留全零。
如果所有版本的前缀固定为一个固定宽度,则有一个更简单的解决方案。但是这个解决方案既可以使用零前缀也可以不使用零。
如果前导零存在,那么Joey的代码将失败,因为它指示八进制符号。前导零的八进制数字无效将被视为字符串,导致比较结果错误。这可能不是问题,因为原始问题意味着前导零不存在。但最好是安全而不是遗憾。
我的确在一定程度上简化了这个问题,严格来说,数字范围从4000到4100 ......我一直在寻找易于理解的答案,尽管xD从来没有在 – Dangercrow 2012-07-26 10:04:03
之前遇到过delayedexpansion你使用tokens = 1 *,%% A和%% B可以做一些解释,但基于你的代码,我能够适应我的需求for循环,太棒了!我还发现,尽管没有明确说明,但空间总是被视为分隔符。 – parvus 2015-10-24 06:32:54
谢谢,但有没有更简单的方法呢?这似乎有点矫枉过正,ish – Dangercrow 2012-07-25 08:13:53
问题是这些数字可能比单个数字更长,然后任何天真的排序都会失效。 – Joey 2012-07-25 08:32:34