2012-07-25 15 views
8

Mam katalogu pełnego plików .jar, nazwany stopniowo tak:Wybierz najwyższy numer pliku - plik wsadowy

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

próbuję wybrać najwyższym numerze pliku. Czy istnieje naprawdę prosty sposób na zrobienie tego? Czy wykonanie .\version*.jar powoduje błąd, prawdopodobnie z powodu wielu plików?

Odpowiedz

11

Musimy opóźnieniem ekspansji

setlocal enabledelayedexpansion 

Tylko zmienną do maksimum:

set max=0 

następnie iteracyjne nad pliki:

for %%x in (version-*.jar) do (

Musimy nazwę pliku bez rozszerzenia

set "FN=%%~nx" 

i wyjąć version- od początku:

set "FN=!FN:version-=!" 

Teraz FN powinien zawierać tylko liczby i możemy porównać:

if !FN! GTR !max! set max=!FN! 
) 

I skończymy:

echo highest version: version-%max%.jar 

Kompletny plik wsadowy:

@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

Dzięki, ale czy istnieje w ogóle prostsza metoda? To wydaje się trochę przesadzone - jest to – Dangercrow

+1

Problem polega na tym, że liczby mogą być dłuższe niż jedna cyfra, a następnie każde nieumiejętne sortowanie zepsuje się. – Joey

3

Oto nieco prostsza wersja niż kod Joey'a.

@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 

Ten kod zadziała, nawet jeśli numery wersji mają zero przedrostków, o ile numer wersji nigdy nie jest równy 0 (zero). Określenie tokenów = 1 * z 0 jako ogranicznikiem powoduje usunięcie zer wiodących z numeru wersji przy zachowaniu wszystkich zer po pierwszej niezerowej cyfrze.

Istnieje prostsze rozwiązanie, jeśli wszystkie wersje mają zerową prefiksję do stałej szerokości. Ale to rozwiązanie działa zarówno z prefiksem zero, jak i bez niego.

Kod Joey'a nie powiedzie się, jeśli występują zera wiodące, ponieważ oznacza to notację ósemkową. Nieprawidłowe cyfry ósemkowe z zerami wiodącymi będą traktowane jako ciągi powodujące porównanie, aby dać zły wynik. Prawdopodobnie nie stanowi to problemu, ponieważ pierwotne pytanie sugeruje, że zera wiodące nie są obecne. Ale lepiej być bezpiecznym niż żałować.

+0

Uprościłem nieco pytanie, ściśle mówiąc, zakres liczb wynosił od 4000 do 4100 ... Szukałem łatwości zrozumienia w odpowiedzi, chociaż xD nigdy nie spotkałem się z opóźnionym rozwinięciem przed – Dangercrow

+0

Twoje użycie tokena = 1 *, %% A i %% B może zrobić z pewnym wyjaśnieniem, ale na podstawie Twojego kodu mogłem dostosować pętlę for do moich potrzeb, świetnie! Odkryłem również, że przestrzeń jest zawsze traktowana jako ogranicznik, chociaż nie jest to wyraźnie powiedziane. – parvus

Powiązane problemy