2012-07-25 15 views
8

tengo un directorio completo de archivos .jar, llamado progresivamente este modo:Elegir archivo numerado más alto - por lotes de archivos

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

Estoy tratando de seleccionar el archivo de número más alto. ¿Hay alguna manera realmente simple de hacerlo? ¿Porque hacer .\version*.jar causa un error, presumiblemente debido a los archivos múltiples?

Respuesta

11

Necesitamos expansión retardada

setlocal enabledelayedexpansion 

Sólo una variable para la máxima:

set max=0 

A continuación, iterar sobre los archivos:

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

Necesitamos el nombre del archivo sin la extensión

set "FN=%%~nx" 

Y quitar el version- desde el principio:

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

ahora FN debe contener sólo el número y podemos comparar:

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

Y hemos terminado:

echo highest version: version-%max%.jar 

El archivo de proceso por lotes completo:

@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

Gracias, pero ¿hay algún método más simple? Parece un poco exagerado – Dangercrow

+1

El problema es que los números pueden ser más largos que un solo dígito y luego cualquier clasificación ingenua se rompe. – Joey

3

Aquí hay una versión un poco más simple que el código de Joey.

@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 

Este código funcionará incluso si los números de versión tienen el prefijo cero siempre que el número de versión no es 0 (cero). Especificar tokens = 1 * con 0 incluido como delimitador hace que los ceros a la izquierda se eliminen del número de versión mientras se conservan todos los ceros después del primer dígito distinto de cero.

Existe una solución más simple si todas las versiones tienen un prefijo cero para un ancho constante. Pero esta solución funciona tanto con prefijo cero como sin él.

El código de Joey fallará si hay ceros a la izquierda porque indica una notación octal. Los dígitos octales no válidos con ceros a la izquierda se tratarán como cadenas, lo que hará que la comparación arroje un resultado incorrecto. Probablemente esto no sea un problema ya que la pregunta original implica que los ceros iniciales no están presentes. Pero es mejor estar a salvo que lamentar.

+0

Sí simplifiqué la pregunta, en sentido estricto los números van desde 4000 a 4100 ... Estaba buscando la facilidad de comprensión en la respuesta, aunque xD nunca me encontré con una expansión anterior a – Dangercrow

+0

Tu uso de tokens = 1 *, %% A y %% B podría ser útil con alguna explicación, pero basado en tu código, pude adaptar el ciclo for para mis necesidades, ¡genial! También encontré que un espacio siempre se considera un delimitador aunque no se indique explícitamente. – parvus

Cuestiones relacionadas