2012-07-25 23 views
8

我有一个目录充满.jar文件,逐步命名就像这样:选择编号最高的文件 - 批处理文件

version-1.jar 
version-2.jar 
version-3.jar 

我试图选择最高编号的文件。有没有真正简单的方法来做到这一点? 因为做.\version*.jar会导致错误,可能是由于多个文件?

回答

11

我们需要延迟扩展

​​

只为最大的变量:

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 
+0

谢谢,但有没有更简单的方法呢?这似乎有点矫枉过正,ish – Dangercrow 2012-07-25 08:13:53

+1

问题是这些数字可能比单个数字更长,然后任何天真的排序都会失效。 – Joey 2012-07-25 08:32:34

3

这是一个比乔伊的代码稍微简单的版本。

@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的代码将失败,因为它指示八进制符号。前导零的八进制数字无效将被视为字符串,导致比较结果错误。这可能不是问题,因为原始问题意味着前导零不存在。但最好是安全而不是遗憾。

+0

我的确在一定程度上简化了这个问题,严格来说,数字范围从4000到4100 ......我一直在寻找易于理解的答案,尽管xD从来没有在 – Dangercrow 2012-07-26 10:04:03

+0

之前遇到过delayedexpansion你使用tokens = 1 *,%% A和%% B可以做一些解释,但基于你的代码,我能够适应我的需求for循环,太棒了!我还发现,尽管没有明确说明,但空间总是被视为分隔符。 – parvus 2015-10-24 06:32:54