Por que não há saída de sequência com ‘echo% var%’ depois de usar ‘set var = text’ na linha de comando?

Eu configurei uma variável no CMD no Windows 8.1 com o comando set e tentei ecoá-la.

Aqui está um exemplo:

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

Então, existe uma maneira de forçar o prompt de comando a ecoar a variável, não o texto bruto?

   

Você precisa aproximar seu texto do símbolo igual:

 set var=text echo %var% text 

Atribuindo um valor / string a uma variável de ambiente

Com as extensões de comando ativadas, como por padrão, o melhor é usar:

 set "var=text" 

O comando é definido e o parâmetro é "variable=value" .

A cadeia de parâmetros pode ser colocada entre aspas duplas como em todos os comandos, desde que as extensões de comandos estejam ativadas por padrão.

Se as aspas duplas não forem usadas em torno de variable=value , o conjunto de comandos interpretará tudo para o final da linha após o primeiro sinal de igual, incluindo espaços não visíveis e guias horizontais no final da linha como valor da cadeia para atribuir à variável.

O nome da variável começa com o primeiro caractere sem espaço em branco (depois de aspas duplas, se usado) e termina à esquerda para o primeiro sinal de igual. O valor atribuído à variável começa à direita do primeiro sinal de igual e termina no final da linha ou na última aspa dupla.

 set VAR = TEXT 

cria uma variável de ambiente com o nome VAR Space e atribui a string Space TEXT a essa variável.

Usando também

 set var="text" 

muitas vezes não está correto, pois isso resulta em atribuir à variável var o texto com as aspas incluídas e todos os espaços e tabulações finais. Fazer referência agora à var em outra linha de código com aspas circunvizinhas geralmente resulta em uma mensagem de erro, pois a variável mantém o próprio texto já com aspas. Para mais detalhes veja a resposta em Como definir variables ​​de ambiente com espaços?

Exemplo:

 @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 

A execução desse pequeno código em lote resulta na saída:

 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. 

Enclosing variable=value entre aspas pode ser feito mesmo que o próprio texto contenha 1 ou mais aspas duplas.

 set "Quote="" 

Esta linha define a variável Quote com o valor " . O conjunto de comandos interpreta tudo após o primeiro sinal de igual deixado para a última aspas como valor a ser atribuído à variável com nome entre a primeira cotação e o primeiro sinal de igual.

Nota: Um valor de string com " dentro e próximo & ou && ou || pode ser até mesmo no uso do set "variable=value" interpretado incorretamente e resultar em comportamento inesperado, como pode ser visto ao executar um arquivo em lote com duas linhas seguintes:

 @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! É a string para atribuir à variável de ambiente, mas atribuída à variável é apenas Value with one double quote in the middle e o resto da linha depois de " no meio e depois & interpretado como operador condicional e não literalmente é interpretado como comando adicional para executar por cmd.exe . O mesmo problema existe com && ou || depois de um " com 0 ou mais espaços / tabulações entre. Este problema não é causado pelo conjunto de comandos. É causado pelo processador de comandos do Windows que divide a linha em uma linha de comando com o conjunto e mais uma linha de comando com eco com execução condicional de a linha de comando de eco .

Atribuição de variables ​​com extensões de comando desativadas

O set "variable=value" syntaxs de comando set "variable=value" não pode ser usado se as extensões de comando estiverem desativadas com setlocal DisableExtensions no arquivo em lotes (ou no registro do Windows que é muito incomum e nunca é visto por mim em nenhum computador Windows). Um erro de syntax seria o resultado na execução do arquivo em lotes.

Só é possível usar set variable=value com as extensões de comando desabilitadas, pelo que o valor pode conter também aspas duplas e deve-se tomar cuidado em espaços / tabulações à direita, pois eles também são atribuídos à variável de ambiente.

Executar em uma janela de prompt de comando cmd /? e setlocal /? para obter mais informações sobre extensões de comando e quais comandos são afetados por extensões de comando. Nota: A lista de saída dos comandos afetados perde a saída, conforme descrito em respostas em Para onde GOTO: EOF retorna?

Atribuição variável via expressão aritmética

Usar o comando set com a opção /A altera completamente a análise do segundo argumento, isto é, a string após set /A Com a opção /A como primeiro argumento, a segunda cadeia é interpretada como expressão aritmética e, portanto, é processada completamente diferente de atribuir um valor de cadeia a uma variável de ambiente. As variables ​​de ambiente são sempre do tipo string e nunca do tipo integer.

O uso da opção /A requer extensões de comando ativadas, caso contrário, o conjunto de comandos ignora completamente o restante da linha sem nenhuma mensagem de erro.

Na maioria dos casos, não é recomendado apenas atribuir um número a uma variável de ambiente usando uma expressão aritmética, ou seja, usando set /A var=1 . set "var=1" ou apenas set var=1 (e sem espaços em branco à direita) são um pouco mais rápidos porque as variables ​​de ambiente são sempre do tipo string.

Em uma expressão aritmética, os espaços em branco são interpretados como delimitadores para nomes de variables, números e operadores. Por esse motivo, o set /A var = 1 linhas de comando set /A var = 1 não define uma variável com o nome VAR Space com a string Space 1, como o set var = 1 faz. set /A var = 1 define uma variável com o nome VAR com valor de string 1 depois de converter 1 de string (arquivo de lote contém 1 como caractere com valor de código hexadecimal 31) para inteiro com valor 1 e de volta para uma string com os dois valores 0x31 e 0x00 (cadeia de terminação nula).

Atribuição variável via prompt

Também usando o comando set com opção /P altera a análise da string após o nome da variável e o sinal de igual. A sequência após o nome da variável e o sinal de igual é interpretada como texto de aviso para saída e não como sequência para designar à variável de ambiente.

A variável de ambiente recebe a string digitada pelo usuário solicitado (ou redirecionada de um arquivo ou comando / aplicativo) ou, caso o usuário não insira nada antes de pressionar RETURN ou ENTER , mantém seu valor atual, respectivamente, se ainda não estiver definido o prompt.

O uso da opção /P requer extensões de comando ativadas, caso contrário, o conjunto de comandos ignora completamente o restante da linha sem nenhuma mensagem de erro.

A syntax mais usada para solicitar um usuário para uma string é:

 set /P var="Please enter something: " 

O conjunto de comandos remove, nesse caso, automaticamente as aspas duplas ao redor do texto do prompt antes de imprimir para manipular STDOUT (janela do console, se não for redirecionado).

Mas o trabalho também é:

 set /P "var=Please enter something: " 

Por favor, leia esta resposta para obter mais detalhes sobre a análise de texto do prompt e como gerar um texto de prompt com aspas duplas adjacentes.