batch-file
Variables en archivos por lotes
Buscar..
Declaración
Para crear una variable simple y asignarla a un valor o cadena, use el comando SET
:
SET var=10
Aquí, el código declara una nueva variable var
con un valor de 10
. Por defecto, todas las variables se almacenan internamente como cadenas; esto significa que el valor 10
no es diferente de foo1234
o Hello, World!
Notas sobre las comillas.
Las comillas utilizadas se incluirán en el valor de la variable:
SET var="new value" <-- %var% == '"new value"'
Espacios en variables
El lenguaje por lotes considera que los espacios son partes aceptables de los nombres de variables. Por ejemplo, set var = 10
resultará en una variable llamada var
que contiene el valor 10
(note el espacio adicional a la derecha de var y la izquierda de 10).
Usando comillas para eliminar espacios
Para evitar espacios, utilice comillas alrededor de toda la tarea; El nombre y valor de la variable. Esto también evita los espacios finales al final de la línea (el carácter ␣
denota un espacio):
SET␣var=my␣new␣value␣ <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣ <-- '%var%' == 'my new value'
Además, utilice comillas al unir varias declaraciones con &
o |
- alternativamente, ponga el símbolo directamente después del final del valor de la variable:
SET var=val & goto :next <-- '%var%' == 'val '
SET "var=val" & goto :next <-- '%var%' == 'val'
SET var=val& goto :next <-- '%var%' == 'val'
Uso
echo %var%
Este código hará eco del valor de var
Si se usa setLocal EnableDelayedExpansion
, lo siguiente setLocal EnableDelayedExpansion
el valor de var
(la expresión estándar% var% no funcionará en ese contexto).
echo !var!
En los archivos por lotes, las variables se pueden usar en cualquier contexto, incluidas partes de comandos o partes de otras variables. No puede llamar a una variable antes de definirla.
Usando variables como comandos:
set var=echo
%var% This will be echoed
Usando variables en otras variables:
set var=part1
set %var%part2=Hello
echo %part1part2%
Sustitución Variable
A diferencia de otros lenguajes de programación, en un archivo por lotes una variable se sustituye por su valor real antes de que se ejecute el script por lotes. En otras palabras, la sustitución se realiza cuando el script de comandos lee el script en la memoria, no cuando el script se ejecuta más tarde.
Esto permite el uso de variables como comandos dentro del script, y como parte de otros nombres de variables en el script, etc. El "script" en este contexto es una línea o bloque de código, rodeado de paréntesis: ()
.
¡Pero este comportamiento significa que no puedes cambiar el valor de una variable dentro de un bloque!
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
ECHO %VAR%
SET VAR=Goodbye
)
imprimirá
Hello
Hello
ya que (como se ve, al ver la ejecución del script en la ventana de comandos) se evalúa para:
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo Hello
SET VAR=Goodbye
)
En el ejemplo anterior, el comando ECHO
se evalúa como Hello
cuando el script se lee en la memoria, por lo que el script repetirá Hello
para siempre, sin embargo, se realizan muchos pasos a través del script.
La forma de lograr el comportamiento variable más "tradicional" (de la variable que se está expandiendo mientras se ejecuta el script) es habilitar la "expansión retrasada". Esto implica agregar ese comando a la secuencia de comandos antes de la instrucción de bucle (generalmente un bucle FOR, en una secuencia de comandos por lotes), y usar un signo de exclamación (!) En lugar de un signo de porcentaje (%) en el nombre de la variable:
setlocal enabledelayedexpansion
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
echo !VAR!
SET VAR=Goodbye
)
endlocal
imprimirá
Hello
Goodbye
La sintaxis %%a in (1,1,2)
hace que el bucle se ejecute 2 veces: en la primera ocasión, la variable lleva su valor inicial de 'Hola', pero en la segunda pasada a través del bucle, después de haber ejecutado la segunda La instrucción SET como la última acción en la 1ª pasada, ha cambiado al valor revisado 'Adiós'.
Sustitución avanzada de variables
Ahora, una técnica avanzada. El uso del comando CALL
permite al procesador de comandos por lotes expandir una variable ubicada en la misma línea del script. Esto puede ofrecer una expansión multinivel, mediante el uso repetido de LLAMADAS y modificadores.
Esto es útil en, por ejemplo, un bucle FOR. Como en el siguiente ejemplo, donde tenemos una lista numerada de variables:
"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"
Podemos lograr esto usando el siguiente bucle FOR:
setlocal enabledelayedexpansion
for %%x in (%*) do (
set /a "i+=1"
call set path!i!=%%~!i!
call echo %%path!i!%%
)
endlocal
Salida:
c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt
Tenga en cuenta que la variable !i!
primero se expande a su valor inicial, 1, luego la variable resultante,% 1, se expande a su valor real de c:\MyFiles\test1.txt
. Esta es la doble expansión de la variable i
. En la siguiente línea, i
es nuevamente doble expandido, mediante el uso del comando CALL ECHO
junto con el prefijo variable %%
, luego se imprime en la pantalla (es decir, se muestra en la pantalla).
En cada paso sucesivo a través del bucle, el número inicial se incrementa en 1 (debido al código i+=1
). Por lo tanto, aumenta a 2
en la 2ª pasada a través del bucle, y a 3
en la 3ª pasada. Por lo tanto, la cuerda hizo eco a la pantalla altera con cada paso.
Declarar múltiples variables
Cuando se definen múltiples variables al comienzo del lote, se puede usar una forma de definición corta empleando una cadena de reemplazo .
@echo off
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly,_C=,_H=,_I=,_J=,_K=,_L=,_D=6
set "%vars:,=" & set "%"
for /f %%l in ('set _') do echo %%l
exit /b
_A=good
_D=6
_E=bad
_G=ugly
Observe en el ejemplo anterior, las variables se ordenan alfabéticamente de forma nativa, cuando se imprimen en la pantalla.
Usando una variable como una matriz
Es posible crear un conjunto de variables que pueden actuar de forma similar a una matriz (aunque no son un objeto de matriz real) utilizando espacios en la instrucción SET
:
@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
echo %%a
)
echo Get the variable directly: %var%
Resultado:
A
"foo bar"
123
Get the variable directly: A "foo bar" 123
También es posible declarar su variable utilizando índices para que pueda recuperar información específica. Esto creará múltiples variables, con la ilusión de una matriz:
@echo off
setlocal enabledelayedexpansion
SET var[0]=A
SET var[1]=foo bar
SET var[2]=123
for %%a in (0,1,2) do (
echo !var[%%a]!
)
echo Get one of the variables directly: %var[1]%
Resultado:
A
foo bar
123
Get one of the variables directly: foo bar
Tenga en cuenta que en el ejemplo anterior, no puede hacer referencia a var
sin indicar cuál es el índice deseado, porque var
no existe en sí mismo. Este ejemplo también utiliza la setlocal enabledelayedexpansion
junto con los puntos de exclamación en !var[%%a]!
. Puede ver más información sobre esto en la Documentación de alcance de sustitución variable .
Operaciones sobre variables
set var=10
set /a var=%var%+10
echo %var%
El valor final de var
es 20.
La segunda línea no funciona dentro de un bloque de comando utilizado, por ejemplo, en una condición IF o en un bucle FOR, ya que se necesitaría una expansión retardada en lugar de una expansión de variable de entorno estándar.
Aquí hay otra, mejor manera de trabajar también en un bloque de comando:
set var=10
set /A var+=10
echo %var%
El entorno del símbolo del sistema admite valores enteros de 32 bits firmados:
- suma
+
y+=
- resta
-
y-=
- multiplicación
*
y*=
- división
/
y/=
- módulo de división
%
y%=
-
&
- bitwise o
|
- bit a bit NO
~
- XOR a nivel de bit
^
- desplazamiento a la izquierda en modo de bits
<<
- desplazamiento a la derecha en modo de bits
>>
-
!
NO lógico!
- Menos unario
-
- agrupando con
(
y)
El intérprete de comandos de Windows no admite valores enteros de 64 bits o valores de coma flotante en expresiones aritméticas.
Nota: El operador %
debe escribirse en un archivo por lotes como %%
para que se interprete como operador.
En una ventana de indicador de comando que ejecuta el set /A Value=8 % 3
línea de comando set /A Value=8 % 3
asigna el valor 2
a la variable de entorno Value
y adicionalmente genera 2
.
En un archivo por lotes se debe escribir set /A Value=8 %% 3
para asignar el valor 2
a la variable de entorno Value
y no se genera nada, respectivamente, para manejar STDOUT (salida estándar). Un set /A Value=8 % 3
líneas set /A Value=8 % 3
en un archivo por lotes daría como resultado un mensaje de error. Falta el operador en la ejecución del archivo por lotes.
El entorno requiere el interruptor /A
para operaciones aritméticas, no para variables de cadena ordinarias.
Cada cadena en la expresión aritmética después del set /A
es si un número o un operador se interpreta automáticamente como el nombre de una variable de entorno.
Por esa razón, se hace referencia al valor de una variable con %variable%
o con !variable!
no es necesario cuando el nombre de la variable consiste solo en caracteres de palabra (0-9A-Za-z_), donde el primer carácter no es un dígito, lo que es especialmente útil dentro de un bloque de comando que comienza con (
y termina con una coincidencia )
.
Los números se convierten de cadena a entero con la función C / C ++ strtol con base
cero, lo que significa una determinación automática de base que puede fácilmente dar resultados inesperados.
Ejemplo:
set Divided=11
set Divisor=3
set /A Quotient=Divided / Divisor
set /A Remainder=Divided %% Divisor
echo %Divided% / %Divisor% = %Quotient%
echo %Divided% %% %Divisor% = %Remainder%
set HexValue1=0x14
set HexValue2=0x0A
set /A Result=(HexValue1 + HexValue2) * -3
echo (%HexValue1% + %HexValue2%) * -3 = (20 + 10) * -3 = %Result%
set /A Result%%=7
echo -90 %%= 7 = %Result%
set OctalValue=020
set DecimalValue=12
set /A Result=OctalValue - DecimalValue
echo %OctalValue% - %DecimalValue% = 16 - 12 = %Result%
La salida de este ejemplo es:
11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4
Las variables no definidas en la evaluación de la expresión aritmética se sustituyen con el valor 0.
Configuración de variables desde una entrada
Usando el interruptor /p
con el comando SET
puede definir variables desde una entrada.
Esta entrada puede ser una entrada de usuario (teclado):
echo Enter your name :
set /p name=
echo Your name is %name%
Que se puede simplificar así:
set /p name=Enter your name :
echo Your name is %name%
O puede obtener la entrada de un archivo:
set /p name=< file.txt
en este caso, obtendrá el valor de la primera línea de file.txt
Obtener el valor de varias líneas en un archivo:
(
set /p line1=
set /p line2=
set /p line3=
) < file.txt