Comparar parte de un nombre de archivo en un archivo por lotes de Windows

Comparar parte de un nombre de archivo en un archivo por lotes de Windows

Considere este guión:

SETLOCAL EnableDelayedExpansion
for /F "tokens=2 delims=." %%G in ("%1") do set partial_name = %%G
 if partial_name GEQ 9200 ( move I:\rosa\transfertmp\%1  L:\OSLDos\Tmp\ ) else  ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ ) 
ENDLOCAL

invocado comothisscript 11111.9100.csv

Lo que quiero hacer es: mover el archivo a la carpeta correcta, según el segundo segmento del nombre del archivo (9100), de modo que si es mayor que 9200, moverlo a una carpeta y si no lo es, moverlo a otra carpeta. .

El problema parece ser que la comparación no funciona.

Respuesta1

Dennis identificó un problema y proporcionó una solución en su respuesta. Pero todavía hay otras cuestiones.

1) Su código set partial_name = %%Gincluirá un espacio final en el nombre de la variable y un espacio inicial en el valor. El código debe leerset partial_name=%%G

2) Es posible que su %1valor ya esté citado, en cuyo caso debe eliminar las comillas antes de agregar el suyo propio usando "%~1"en lugar de "%1".

3) Quizás no sea un problema en su caso, pero generalmente es una buena idea incluir las rutas de los archivos entre comillas en caso de que el nombre contenga espacios o caracteres especiales.

4) Supongo que quieres hacer una comparación numérica. El comando IF utiliza casi las mismas reglas que el comando SET /A cuando intenta analizar un número: cualquier número con el prefijo 0 se tratará como notación hexadecimal. Si encuentra un dígito hexadecimal no válido como 8 o 9, entonces el IF volverá a una comparación de cadenas en lugar de una comparación numérica.

Por ejemplo if 09 lss 8 (echo true) else echo falsedevoluciones true.

Entonces, si el segundo segmento de su nombre de archivo tiene el potencial de tener ceros a la izquierda, entonces necesita trabajar más.

set "partial_name="
for /f "tokens=2 delims=." %%G in ("%~1") do (
  for /f "tokens=* delims=0" %%N in ("%%G") do set /a "partial_name=%%N"
  if not defined partial_name set "partial_name=0"
)
if %partial_name% GEQ 9200 (
  move "I:\rosa\transfertmp\%1" "L:\OSLDos\Tmp\"
) else (
  move "I:\rosa\transfertmp\%1" "L:\LdisOSLDos\Tmp\"
)

Respuesta2

En realidad, estás comparando la cadena partial_name, 9100no el contenido de la variable.

Dado que p GEQ 9esto se evaluará como verdadero.

Además, set partial_name = %%Gse establece partial_name en  %%G(tenga en cuenta los espacios finales e iniciales).

Para solucionar ambos problemas, rodee el nombre de la variable con signos de porcentaje ( %) y elimine los espacios que rodean el signo igual ( =):

for /F "tokens=2 delims=." %%G in ("%1") do set partial_name=%%G
 if %partial_name% GEQ 9200 ( move I:\rosa\transfertmp\%1  L:\OSLDos\Tmp\ ) else  ( move I:\rosa\transfertmp\%1 L:\LdisOSLDos\Tmp\ )

información relacionada