2016-08-08 52 views
0

Wenn ich ein Verzeichnis vollen Textdateien wieBatch: Return Dateiname mit dem höchsten integer

01.text.sql 
02text.sql 
3text.sql 

wie würde ich den Namen der Datei mit der höchsten ganzen Zahl zurückgeben z.B. 3.text.sql? Wie Sie sehen können, wird den Zahlen möglicherweise kein 0 vorangestellt und möglicherweise fehlt a. nach der Ganzzahl. Ich weiß, dass ich eine Schleife durch das Verzeichnis mit etwas wie diese

Choose Highest Numbered File - Batch File

dies jedoch nicht berücksichtigt unterschiedliche Dateinamen-Formate übernimmt. Gibt es eine Möglichkeit, wie ein Batch-Skript ein Verzeichnis durchlaufen kann und automatisch die Datei mit der höchsten Ganzzahl zieht oder muss ich die Dateinamen speichern und sie in einer separaten Schleife miteinander vergleichen?

Zur Zeit habe ich so etwas wie diese, aber es gibt 3text statt nur 3

SETLOCAL enabledelayedexpansion 
SET max=0 
FOR %%x in (*.sql) DO (
    SET "FN=%%~nx" 
    SET "FN=!FN:*-=!" 
    IF !FN! GTR !max! SET max=!FN! 
) 
ECHO Highest script number is %max% 

Aktualisiert Schleife:

SETLOCAL enabledelayedexpansion 
SET scriptmax=0 
FOR %%x in (*.sql) DO (
    SET "FN=%%~nx" 
    SET a=1000!FN! 
    SET /A FN=a %% 1000 
    IF !FN! GTR !max! SET max=!FN! 
) 

Antwort

3

set /A a=b wird alles in b bis zum ersten nicht numerischen Zeichen als eine Interpretation Nummer, so

set FN=03text.txt 
set /A a=FN 

wird gesetzt %a% schön zu 3. Aber wir haben hier ein zusätzliches Problem: Zahlen mit dem Präfix 0 werden als oktal interpretiert, also sind 08 und 09 illegal. Um dies zu beheben:

wird 9 ergeben.

Dies wird jedoch nur funktionieren, wenn Sie wissen, wie viele Stellen zu erwarten, vielleicht müssen Sie prüfen, für eine führende Null ersten (if "%FN:~0,1%" == "0" ...), und/oder sogar abhacken führende Nullen (set FN=%FN:~1%)

Edit: ein besserer Weg:

set FN=09text.txt 
set a=1000!FN! 
set /A FN=a %% 1000 

wird

+0

bis zu 999. für etwas arbeiten, wenn Sie die vorher vorane Ziffer abspalten '1' statt Subtraktion '100' dann brauchen Sie nicht, wie viele Stellen zu wissen, dass es sind insgesamt ... – aschipfl

+0

@aschipl: wie? Ich habe versucht, einen Weg zu finden, aber% a: ~ 1% lässt mich wieder mit 09? – ths

+0

Verbleibende führende Nullen könnten mit diesem entfernt werden: 'for/F" Token = * delims = 0 "%% Z in ("% FN: ~ 1% ") setze" FN = %% Z "& setze/A" FN + = 0 "'; aber es scheint, dass Sie in der Zwischenzeit eine noch einfachere Lösung gefunden haben ... – aschipfl