2012-07-25 82 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