Definición y uso de una variable en archivo por lotes

450

Estoy tratando de definir y usar una variable en un archivo por lotes. Parece que debería ser simple:

@echo off

set location = "bob"
echo We're working with "%location%"

El resultado que obtengo es el siguiente:

We're working with ""

¿Que está pasando aqui? ¿Por qué mi variable no se repite?

Jamie Dixon
fuente

Respuestas:

552

El espacio antes del =se interpreta como parte del nombre, y el espacio después del mismo (así como las comillas) se interpretan como parte del valor. Por lo tanto, se puede hacer referencia a la variable que ha creado %location %. Si eso no es lo que desea, elimine los espacios adicionales en la definición.

Brian Nixon
fuente
77
Si el espacio anterior =se interpreta como parte del nombre, entonces no se puede hacer referencia a la variable %location%, se debe hacer referencia a ella como %location %. ¿Es eso un error tipográfico?
Variable miserable
77
@ Variable miserable: Tienes razón; Parece que la respuesta original fue víctima de una edición incorrecta.
Brian Nixon
18
Así que esto es con lo que vino MS
Falaque
55
@Falaque A diferencia de alias x = yen * nix land?
Básico
1
@Falaque, ¿qué crees que bash hará cuando se ejecute x = y?
phuclv
263

Los espacios son significativos. Creó una variable denominada 'location ' con un valor de
' "bob"'. Nota: se agregaron comillas simples para mostrar la ubicación del espacio.

Si desea cotizaciones en su valor, entonces su código debería verse así

set location="bob"

Si no desea cotizaciones, entonces su código debería verse así

set location=bob

O mejor aún

set "location=bob"

La última sintaxis evita que los espacios finales involuntarios entren en el valor y también protege contra caracteres especiales como & |etc.

dbenham
fuente
8
¿Hay inconvenientes para la última sintaxis?
Wolf
8
@ Wolf - No, no hay inconveniente. Sin embargo, hay un límite para cuándo es más efectivo. Mientras el valor no contenga comillas, casi todos los caracteres pueden aparecer en el valor sin preocuparse por escapar. Las excepciones son %, y posiblemente !si la expansión retrasada está habilitada. Pero si el valor contiene comillas, entonces debe preocuparse cuando para escapar caracteres como veneno |, &etc.
dbenham
1
Esto parece ser lo mismo que configurar la variable de entorno en Windows. ¿Es esta la única forma de usar variables locales en scripts por lotes?
Parásito
1
@Wolf, es suficiente para asegurar que las extensiones de comando están habilitadas, pero esta es la configuración por defecto de todos modos ...
aschipfl
7

entrada location.bat

@echo off
cls

set /p "location"="bob"
echo We're working with %location%
pause

salida

We're working with bob

(errores que has hecho: spacey " ")

Philip
fuente
44
set /ppregunta al usuario y almacena la respuesta en la variable especificada. por ejemplo,set /p name="What is your name? " & echo Hello, %name%.
Robert Mooney
66
-1, la sintaxis set /p "varname"="text"es incorrecta, crea una variable llamada location"(¡con una comilla final!). Debería ser set /p location="bob". Pero incluso entonces, ya no coincide con la pregunta
jeb