Cálculo (aritmética)
A veces quieres que un archivo por lotes cuente repeticiones, calcule un total o genere un número aleatorio, como al tirar un dado.
Para hacer cálculos en el símbolo del sistema, añade la opción /a al comando set. Este artículo explica desde el uso básico hasta las precauciones con las que es fácil tropezar.
Uso básico
set /a nombre_de_variable=expresión
set /a RESULT=10 + 5
echo %RESULT%
El resultado se asigna a la variable RESULT. Si escribes el comando directamente en el símbolo del sistema, el resultado se muestra tal cual. Dentro de un archivo por lotes no se muestra, así que usa echo si necesitas imprimirlo.
Dentro de una expresión de set /a puedes escribir los nombres de variable tal cual. Como en set /a TOTAL=PRICE * 3, se usa el valor de la variable sin encerrarla entre % o !. Una variable que no existe se trata como 0.
Operadores disponibles
| Operador | Significado | Ejemplo | Resultado |
|---|---|---|---|
+ | Suma | set /a X=7 + 3 | 10 |
- | Resta | set /a X=7 - 3 | 4 |
* | Multiplicación | set /a X=7 * 3 | 21 |
/ | División (entera) | set /a X=7 / 3 | 2 |
% | Resto | set /a X=7 %% 3 (en un archivo por lotes) | 1 |
( ) | Indicar la prioridad | set /a X=(2 + 3) * 4 | 20 |
La multiplicación, la división y el resto se evalúan antes que la suma y la resta.
El % que calcula el resto debe duplicarse como %% dentro de un archivo por lotes. Si lo escribes directamente en el símbolo del sistema, escribe un solo %.
Actualizar una variable (contadores y totales)
Puedes usar +=, -=, *=, /= y %%=, que asignan y calculan en un solo paso. (%%= es la forma para archivos por lotes; si lo escribes directamente en el símbolo del sistema, usa %=.)
set COUNT=0
set /a COUNT+=1
set /a COUNT+=1
echo %COUNT%

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
Este es un ejemplo que calcula un total dentro de un bucle for. set /a puede leer variables directamente dentro del bucle, pero se necesita expansión retardada (!nombre_de_variable!) para mostrar el total parcial con echo dentro del bucle.
@echo off
setlocal EnableDelayedExpansion
set SUM=0
for %%N in (10 20 30) do (
set /a SUM+=%%N
echo Total parcial: !SUM!
)
echo Total: !SUM!
endlocal
Consulta el artículo sobre la expansión retardada para más detalles.
No admite decimales
set /a solo trabaja con números enteros. En el resultado de una división se descarta la parte decimal.
set /a X=7 / 2
echo %X%
Si necesitas decimales, una opción es multiplicar antes por 100 o similar y calcular con enteros.
set PRICE=1980
set /a TAX=PRICE * 10 / 100
set /a TOTAL=PRICE + TAX
echo Impuesto: %TAX% / Total con impuesto: %TOTAL%
Si necesitas un cálculo decimal exacto, también puedes llamar a PowerShell.
powershell -NoProfile -Command "[math]::Round(1980 * 1.1)"
Generar números aleatorios
%RANDOM% devuelve un número aleatorio de 0 a 32767. Si usas el resto, puedes acotar el rango.
set /a DICE=%RANDOM% %% 6 + 1
echo %DICE%
%RANDOM% %% 6 da de 0 a 5, así que + 1 lo convierte en de 1 a 6.
Hexadecimal y operaciones de bits
Si antepones 0x, puedes indicar un número hexadecimal.
set /a X=0xFF
echo %X%
Entre las operaciones de bits están & (AND), | (OR), ^ (XOR), << y >>. Como también son caracteres especiales del símbolo del sistema, debes encerrar toda la expresión entre comillas dobles.
set /a "X=6 & 3"
set /a "Y=1 << 4"
echo %X% %Y%
Si escribes set /a X=6 & 3 sin comillas, & se interpreta como separador de comandos y el comportamiento no es el esperado.
Precauciones
El rango es de enteros de 32 bits
Los números que se pueden manejar van de -2147483648 a 2147483647. Si el resultado de un cálculo se sale del rango, no se produce un error; el valor se desborda y se obtiene un valor incorrecto. Sin embargo, escribir directamente un número fuera de rango como 2147483648 sí produce un error.
set /a X=2147483647 + 1
echo %X%
Ten cuidado al trabajar con números grandes, por ejemplo al calcular tamaños de archivo.
Los números que empiezan por 0 se tratan como octales
Los números que empiezan por 0, como 08 o 09, se interpretan como octales. En octal no existen el 8 ni el 9, así que se produce un error.
set /a X=08 + 1
Este problema aparece cuando usas directamente en un cálculo valores extraídos de %TIME%, como minutos o segundos como «08» o «09». Si antepones 1 y restas 100, se tratan como decimales.
set MIN=%TIME:~3,2%
set /a MIN=1%MIN% - 100
echo %MIN%
Si MIN es 08, entonces 108 - 100 da 8.
Dividir entre 0 produce un error
set /a X=10 / 0
Si el divisor es una variable, comprueba con if que no sea 0 antes de calcular.
Mostrar un resultado rellenado con ceros
Para nombres de archivo secuenciales (001, 002), resulta práctico sumar 1000 y luego tomar los dígitos de la derecha.
set /a NUM=1000 + 7
echo %NUM:~1%
Cómo extraer una parte de una cadena se explica en detalle en el artículo sobre operaciones con cadenas.
Resumen
| Qué quieres hacer | Cómo se escribe |
|---|---|
| Guardar un resultado en una variable | set /a X=1 + 2 |
| Contar hacia arriba | set /a COUNT+=1 |
| Obtener el resto (en un archivo por lotes) | set /a X=10 %% 3 |
| Número aleatorio de 1 a N | set /a X=%RANDOM% %% N + 1 |
| Operación de bits | set /a "X=6 & 3" (entre comillas) |
| Cálculo con decimales | Multiplicar por 100 y usar enteros, o usar PowerShell |