Definiowanie i używanie zmiennej w pliku wsadowym

450

Próbuję zdefiniować i użyć zmiennej w pliku wsadowym. Wygląda na to, że powinno być proste:

@echo off

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

Wynik, który otrzymuję, jest następujący:

We're working with ""

Co tu się dzieje? Dlaczego moja zmienna nie jest wyświetlana?

Jamie Dixon
źródło

Odpowiedzi:

552

Spacja przed =znakiem jest interpretowana jako część nazwy, a spacja po nim (a także znaki cudzysłowu) są interpretowane jako część wartości. Zatem do utworzonej zmiennej można się odwoływać %location %. Jeśli nie tego chcesz, usuń dodatkowe miejsca w definicji.

Brian Nixon
źródło
7
Jeśli poprzednia spacja =jest interpretowana jako część nazwy, to do zmiennej nie można się odwoływać jako %location%, należy do niej odwoływać się jako %location %. Czy to literówka?
Nędzna zmienna,
7
@Miserable Variable: Masz rację; wydaje się, że oryginalna odpowiedź padła ofiarą niepoprawnej edycji.
Brian Nixon,
18
Tak właśnie przyszło stwardnienie rozsiane
Falaque
5
@Falaque W przeciwieństwie do alias x = yin * nix land?
Podstawowy
1
@Falaque, więc jak myślisz, co zrobi bash podczas uruchamiania x = y?
phuclv
263

Przestrzenie są znaczące. Utworzyłeś zmienną o nazwie 'location ' o wartości
' "bob"'. Uwaga - dodano pojedyncze cudzysłowy, aby pokazać lokalizację przestrzeni.

Jeśli chcesz cytować w swojej wartości, twój kod powinien wyglądać

set location="bob"

Jeśli nie chcesz cytatów, twój kod powinien wyglądać

set location=bob

Lub jeszcze lepiej

set "location=bob"

Ostatnia składnia zapobiega wprowadzaniu wartości przez przypadkowe spacje końcowe, a także chroni przed znakami specjalnymi, takimi jak & | itp.

dbenham
źródło
8
Czy są jakieś wady ostatniej składni?
Wolf,
8
@Wolf - Nie, nie ma wad. Istnieje jednak limit czasu, kiedy jest najbardziej skuteczny. Dopóki wartość nie zawiera cudzysłowów, prawie wszystkie znaki mogą pojawiać się w wartości bez obawy o ucieczkę. Wyjątkami są %i być może, !jeśli opóźnione rozszerzenie jest włączone. Ale jeśli wartość nie zawiera cytaty, trzeba martwić podczas ucieczki znaki trucizny jak |, &itp
dbenham
1
wydaje się to być takie samo, jak ustawienie zmiennej środowiskowej w systemie Windows. Czy to jedyny sposób używania zmiennych lokalnych w skryptach wsadowych?
parasrish
1
@Wolf, musisz tylko upewnić się, że rozszerzenia poleceń są włączone, ale i tak jest to domyślna konfiguracja ...
aschipfl,
7

Wejście location.bat

@echo off
cls

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

wynik

We're working with bob

(błędy, które popełniłeś: spacei " ")

Philip
źródło
4
set /pmonituje użytkownika i zapisuje odpowiedź w określonej zmiennej. np.set /p name="What is your name? " & echo Hello, %name%.
Robert Mooney
6
-1, składnia set /p "varname"="text"jest niepoprawna, tworzy zmienną o nazwie location"(z końcowym cytatem!). Powinno być set /p location="bob". Ale nawet wtedy nie pasuje już do pytania
jeb