¿Por qué no hay salida de cadena con ‘echo% var%’ después de usar ‘set var = text’ en la línea de comandos?

Establecí una variable en CMD en Windows 8.1 con el comando set , y traté de repetirlo.

Aquí hay un ejemplo:

  C:\Users\Logan>set var = text C:\Users\Logan>set var var = text C:\Users\Logan>echo %var% %var% C:\Users\Logan> 

Entonces, ¿hay alguna manera de forzar al símbolo del sistema a repetir la variable, no el texto sin formato?

Necesitas acercar tu texto del símbolo igual:

 set var=text echo %var% text 

Asignación de un valor / cadena a una variable de entorno

Con las extensiones de comando habilitadas, de manera predeterminada, lo mejor es usar:

 set "var=text" 

El comando se establece y el parámetro es "variable=value" .

La cadena de parámetros se puede incluir entre comillas dobles como en todos los comandos, siempre que las extensiones de comando estén habilitadas de manera predeterminada.

Si las comillas dobles no se utilizan alrededor de la variable=value , el conjunto de comandos interpreta todo al final de la línea después del primer signo igual incluyendo espacios no visibles y tabs horizontales al final de la línea como valor de cadena para asignar a la variable.

El nombre de la variable comienza con el primer carácter que no sea de espacio en blanco (después de la comilla doble si se usa) y termina con el primer signo de igual a la izquierda. El valor asignado a la variable comienza a la derecha del primer signo igual y termina al final de la línea o la última comilla doble.

 set VAR = TEXT 

crea una variable de entorno con el nombre VAR Space y asigna la cadena Space TEXT a esta variable.

También usando

 set var="text" 

a menudo no es correcto, ya que esto se traduce en asignar variables al texto con las comillas incluidas y todos los espacios y tabs finales. Hacer referencia ahora a var en otra línea de código con comillas circundantes a menudo da como resultado un mensaje de error ya que la variable contiene el texto ya con comillas. Para obtener más detalles, consulte la respuesta sobre ¿Cómo establecer variables de entorno con espacios?

Ejemplo:

 @echo off setlocal set "var=text" set "var = text" set "var1=and more text" set var2="and more text" set var3="text with 1 trailing space" set var echo var3=%var3%^<- Do you see the trailing space? echo/ set UnwantedSpaceVar=Hello echo %UnwantedSpaceVar%! ^<- Where does the space come from? echo/ echo There is a trailing space after Hello in this code snippet. echo/ set "TrailingSpacesIgnored=Hi" echo %TrailingSpacesIgnored%! ^<- The 3 trailing spaces above are ignored. echo/ endlocal pause 

La ejecución de este pequeño código de lote da como resultado el resultado:

 var=text var = text var1=and more text var2="and more text" var3="text with 1 trailing space" var3="text with 1 trailing space" <- Do you see the trailing space? Hello ! <- Where does the space come from? There is a trailing space after Hello in this code snippet. Hi! <- The 3 trailing spaces above are ignored. 

La variable=value adjunta variable=value entre comillas se puede hacer incluso si el texto en sí contiene 1 o más comillas dobles.

 set "Quote="" 

Esta línea define la variable Quote con el valor " . Conjunto de comandos interpreta todo después del primer signo igual dejado a la última comilla doble como valor para asignar a la variable con el nombre entre la primera y el primer signo igual.

Nota: Un valor de cadena con " dentro y al lado & o && o || puede ser incluso en el uso del set "variable=value" malinterpretado y dar como resultado un comportamiento inesperado, como puede verse al ejecutar un archivo por lotes con las siguientes dos líneas:

 @echo off set "Variable=Value with one double quote in the middle" & echo Oh, there is something wrong here!" 

Value with one double quote in the middle" & echo Oh, there is something wrong here! Es la cadena para asignar a la variable de entorno, pero asignada a la variable es solo Value with one double quote in the middle y el rest de la línea después de " en el medio y después interpretado como operador condicional y no literalmente se interpreta como un comando adicional para ejecutar por cmd.exe . El mismo problema existe con && o || después de " con 0 o más espacios / tabs entre." Este problema no es causado por el comando establecido . Es causado por el procesador de comandos de Windows que divide la línea en una línea de comando con set y una línea de comando más con echo con ejecución condicional de la línea de comando echo

Asignación de variables con extensiones de comando deshabilitadas

La syntax de comando set "variable=value" no se puede usar si las extensiones de comando están deshabilitadas con setlocal DisableExtensions en el archivo de proceso por lotes (o en el registro de Windows que es poco común y nunca visto en ninguna computadora con Windows). Un error de syntax sería el resultado de la ejecución del archivo por lotes.

Solo es posible usar set variable=value con extensiones de comando deshabilitadas donde el valor puede contener también comillas dobles y se debe tener cuidado en espacios / tabs finales ya que también se asignan a la variable de entorno.

Ejecutar en una ventana de símbolo del sistema cmd /? y setlocal /? para obtener más información acerca de las extensiones de comando y qué comandos se ven afectados por las extensiones de comando. Nota: La lista de salida de los comandos afectados falla la salida como se describe en las respuestas en ¿A dónde regresa GOTO: EOF?

Asignación de variables mediante expresión aritmética

El uso del conjunto de comandos con la opción /A cambia completamente el análisis del segundo argumento, es decir, la cadena después del set /A Con la opción /A como primer argumento, la segunda cadena se interpreta como expresión aritmética y, por lo tanto, se procesa completamente diferente a la asignación de un valor de cadena a una variable de entorno. Las variables de entorno son siempre de tipo cadena y nunca de tipo entero.

El uso de la opción /A requiere extensiones de comando habilitadas, ya que, de lo contrario, el conjunto de comandos ignorará por completo el rest de la línea sin ningún mensaje de error.

En la mayoría de los casos, no se recomienda asignar un número a una variable de entorno utilizando una expresión aritmética, es decir, usando set /A var=1 . set "var=1" o simplemente set var=1 (y sin espacios en blanco al final) son un poco más rápidos porque las variables de entorno siempre son de tipo cadena.

En una expresión aritmética, los espacios en blanco se interpretan como delimitadores de nombres de variables, números y operadores. Por esa razón, la línea de comando set /A var = 1 no define una variable con el nombre VAR Space con la cadena Space 1 como lo set var = 1 does. set /A var = 1 define una variable con el nombre VAR con el valor de cadena 1 después de convertir 1 de cadena (el archivo por lotes contiene 1 como carácter con el código hexadecimal 31) para enterrar con el valor 1 y volver a una cadena con los dos valores 0x31 y 0x00 (cadena que termina nula).

Asignación variable a través de un aviso

Además, al usar el conjunto de comandos con la opción /P cambia el análisis sintáctico de la cadena después del nombre de la variable y el signo igual. La cadena después del nombre de la variable y el signo igual se interpreta como texto de solicitud de salida y no como cadena para asignar a la variable de entorno.

La variable de entorno se asigna a la cadena ingresada por el usuario solicitado (o redirigida desde un archivo o comando / aplicación), o en caso de que el usuario no ingrese nada antes de presionar RETORNO o ENTER , mantiene su valor actual, respectivamente, sigue indefinido si no se definió anteriormente el aviso.

El uso de opción /P requiere extensiones de comando habilitadas, ya que, de lo contrario, el conjunto de comandos ignorará por completo el rest de la línea sin ningún mensaje de error.

La syntax más utilizada para solicitarle a un usuario una cadena es:

 set /P var="Please enter something: " 

El conjunto de comandos elimina en este caso automáticamente las comillas dobles alrededor del texto de la solicitud antes de imprimir para manejar STDOUT (ventana de la consola si no se redirige).

Pero el trabajo también es:

 set /P "var=Please enter something: " 

Lea esta respuesta para obtener más detalles sobre el análisis rápido de texto y cómo generar un texto de aviso con las comillas dobles que lo rodean.