Definindo e Utilizando uma Variável no Arquivo em Lote

450

Estou tentando definir e usar uma variável em um arquivo em lotes. Parece que deve ser simples:

@echo off

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

A saída que recebo é a seguinte:

We're working with ""

O que está acontecendo aqui? Por que minha variável não está sendo ecoada?

Jamie Dixon
fonte

Respostas:

552

O espaço antes de =é interpretado como parte do nome e o espaço depois dele (bem como as aspas) é interpretado como parte do valor. Portanto, a variável que você criou pode ser referenciada %location %. Se não é isso que você deseja, remova os espaços extras na definição.

Brian Nixon
fonte
7
Se o espaço anterior =for interpretado como parte do nome, a variável não poderá ser referenciada como %location%, ela deverá ser referenciada como %location %. Isso é um erro de digitação?
Variável miserável
7
@ Variável miserável: Você está certo; parece que a resposta original foi vítima de uma edição incorreta.
Brian Nixon
18
Então é isso que a MS veio com
Falaque
5
@Falaque Em oposição à alias x = yterra * nix?
Basic
1
@Falaque então o que você acha que o bash fará ao executar x = y?
Phuclv
263

Os espaços são significativos. Você criou uma variável nomeada 'location ' com um valor de
' "bob"'. Nota - aspas simples anexadas foram adicionadas para mostrar a localização do espaço.

Se você deseja aspas no seu valor, seu código deve se parecer com

set location="bob"

Se você não quiser aspas, seu código deve parecer

set location=bob

Ou melhor ainda

set "location=bob"

A última sintaxe impede que espaços à direita inadvertidos cheguem ao valor e também protege contra caracteres especiais como & |etc.

dbenham
fonte
8
Existem desvantagens para a última sintaxe?
Lobo
8
@ Wolf - Não, não há desvantagem. No entanto, há um limite para quando é mais eficaz. Contanto que o valor não contenha aspas, quase todos os caracteres podem aparecer no valor sem se preocupar em escapar. As exceções são %e, possivelmente, !se a expansão atrasada estiver ativada. Mas, se o valor não contém aspas, então você deve se preocupar quando para escapar caracteres veneno como |, &, etc.
dbenham
1
isso parece ser o mesmo que definir a variável de ambiente no Windows. Essa é a única maneira de usar variáveis ​​locais em scripts em lote?
parasrish
1
@Wolf, você só tem que garantir que as extensões de comando estão ativadas, mas esta é a configuração padrão de qualquer maneira ...
aschipfl
7

entrada location.bat

@echo off
cls

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

resultado

We're working with bob

(erros que você fez: spacee " ")

Philip
fonte
4
set /psolicita ao usuário e armazena a resposta na variável especificada. por exemplo,set /p name="What is your name? " & echo Hello, %name%.
Robert Mooney
6
-1, a sintaxe set /p "varname"="text"está incorreta, ela cria uma variável chamada location"(com uma citação à direita!). Deveria ser set /p location="bob". Mas, mesmo assim, ele não coincide com a questão mais
jeb