Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Choose Highest Numbered File - Batch File

I have a directory full of .jar files, named progressively like so:

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

I am trying to select the highest numbered file. Is there any really simple way to do it? Because doing .\version*.jar causes an error, presumably due to the multiple files?

like image 588
Dangercrow Avatar asked Jul 25 '12 08:07

Dangercrow


2 Answers

We need delayed expansion

setlocal enabledelayedexpansion

Just a variable for the maximum:

set max=0

Then iterate over the files:

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

We need the file name without extension

  set "FN=%%~nx"

And remove the version- from the start:

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

Now FN should contain just the number and we can compare:

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

And we're done:

echo highest version: version-%max%.jar

The complete batch file:

@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
like image 175
Joey Avatar answered Oct 17 '22 17:10

Joey


Here is a slightly simpler version than Joey's code.

@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

This code will work even if the version numbers are zero prefixed as long as the version number is never 0 (zero). Specifying tokens=1* with 0 included as a delimiter causes leading zeros to be stripped from the version number while preserving all zeros after the first non-zero digit.

There is a simpler solution if all versions are zero prefixed to a constant width. But this solution works both with and without zero prefixing.

Joey's code will fail if leading zeros are present because that indicates octal notation. Invalid octal digits with leading zeros will be treated as strings causing the comparison to give the wrong result. This is probably not an issue since the original question implies leading zeros are not present. But better to be safe than sorry.

like image 6
dbenham Avatar answered Oct 17 '22 18:10

dbenham