
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 = %%G
incluirá 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 %1
valor 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 false
devoluciones 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
, 9100
no el contenido de la variable.
Dado que p GEQ 9
esto se evaluará como verdadero.
Además, set partial_name = %%G
se 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\ )