¿Por qué no aparece una cadena con 'echo %var%' después de usar el comando 'set var = text' en cmd? [duplicar]

Resuelto asked hace 9 años • 2 respuestas

Configuré una variable en cmd con el setcomando y echolo intenté.

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>

¿Hay alguna manera de forzar el cmd a echola variable y no al texto sin formato?

 avatar Oct 15 '14 22:10
Aceptado

Asignar un valor/cadena a una variable de entorno

Es mejor utilizar la siguiente sintaxis con las extensiones de comando habilitadas para definir o modificar una variable de entorno:

set "var=text"

El comando está configurado y el parámetro es "variable=value".

La cadena del parámetro se puede encerrar entre comillas dobles como en todos los comandos, siempre que las extensiones de comando estén habilitadas de forma predeterminada.

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

El nombre de la variable comienza con el primer carácter que no sea un espacio en blanco (después de las comillas dobles, si se usan) y termina a la izquierda en el primer signo igual. 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

La línea de comando anterior crea una variable de entorno con el nombre VARSpace y asigna la cadena SpaceTEXTO a esta variable.

El uso de

set var="text"

a menudo no es correcto ya que esto da como resultado la asignación a la variable vardel texto con las comillas incluidas y todos los espacios y tabulaciones finales. Hacer referencia ahora vara otra línea de código rodeada de comillas a menudo genera un mensaje de error ya que la variable contiene el texto que ya está entre comillas. Para obtener más detalles, consulte la respuesta sobre ¿Cómo configurar variables de entorno con espacios?

Ejemplo:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
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 por lotes 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.

variable=valueSe puede encerrar entre comillas incluso si el texto mismo contiene 1 o más comillas dobles.

set "Quote=""

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

Nota: Un valor de cadena con "dentro y siguiente &o puede incluso malinterpretarse en uso y, por lo tanto &&, dar como resultado un comportamiento inesperado, como se puede ver al ejecutar un archivo por lotes con las siguientes dos líneas:||set "variable=value"

@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 middley el resto de la línea después "en el medio y después &se interpreta como operador condicional y no literalmente se interpreta como un comando adicional para ejecutar cmd.exe. El mismo problema existe con &&o ||después de un "con 0 o más espacios/tabulaciones entre ellos. Este problema no es causado por el conjunto de comandos . 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 sintaxis del comando set "variable=value"no se puede utilizar si las extensiones del comando están deshabilitadas setlocal DisableExtensionsen el archivo por lotes (o en el registro de Windows, lo cual es muy poco común y nunca lo he visto en ninguna computadora con Windows). Se produciría un error de sintaxis al ejecutar el archivo por lotes.

Solo es posible usarlo set variable=valuecon las extensiones de comando deshabilitadas, por lo que el valor también puede contener comillas dobles y se debe tener cuidado con los espacios/tabulaciones finales, ya que también están asignados a la variable de entorno.

Ejecútelo en una ventana del símbolo del sistema cmd /?y setlocal /?para obtener más información sobre las extensiones de comando y qué comandos se ven afectados por las extensiones de comando. Nota: La lista de salida de los comandos afectados omite la salida como se describe en las respuestas sobre ¿ 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 /Acambia completamente el análisis del segundo argumento, es decir, la cadena después set /A. Con la opción /Acomo primer argumento, la segunda cadena se interpreta como una expresión aritmética y, por lo tanto, se procesa de manera 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 /Arequiere extensiones de comando habilitadas; de lo contrario, el conjunto de comandos ignora el resto de la línea por completo sin ningún mensaje de error.

En la mayoría de los casos, no se recomienda simplemente asignar un número a una variable de entorno usando 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 nombre VARSpace con la cadena Space1 como set var = 1lo hace. set /A var = 1define una variable con nombre VAR con valor de cadena 1 después de convertir 1de cadena (el archivo por lotes contiene 1un carácter con valor de código hexadecimal 31) a un número entero con valor 1y nuevamente a una cadena con los dos valores 0x31 y 0x00 (cadena que termina en nulo).

Asignación de variables mediante un mensaje

Además, el uso del conjunto de comandos con opción /Pcambia el análisis 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 para generar y no como una cadena para asignar a la variable de entorno.

A la variable de entorno se le asigna 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 RETURNo ENTER, mantiene su valor actual respectivamente, aún no está definido si no se define antes del mensaje .

El uso de la opción /Prequiere extensiones de comando habilitadas; de lo contrario, el conjunto de comandos ignora el resto de la línea por completo sin ningún mensaje de error.

La sintaxis más utilizada para solicitar una cadena a un usuario es:

set /P var="Please enter something: "

En este caso , el conjunto de comandos elimina automáticamente las comillas dobles alrededor del texto del mensaje antes de imprimir para manejar STDOUT (ventana de consola si no se redirige).

Pero trabajar también es:

set /P "var=Please enter something: "

Lea esta respuesta para obtener más detalles sobre el análisis de texto de solicitud y cómo generar un texto de solicitud entre comillas dobles circundantes.

Mofi avatar Oct 15 '2014 17:10 Mofi

Debes eliminar los espacios en blanco antes y después =:

set "var=text"
echo %var%
text
CrYoSoRe avatar Oct 15 '2014 15:10 CrYoSoRe