Визначення та використання змінної у пакетному файлі


450

Я намагаюся визначити і використовувати змінну в пакетному файлі. Схоже, це повинно бути просто:

@echo off

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

Вихід, який я отримую, такий:

We're working with ""

Що тут відбувається? Чому моя змінна не відлунюється?

Відповіді:


552

Простір перед =символом інтерпретується як частина імені, а пробіл після нього (як і лапки) інтерпретується як частина значення. Отже, на створену вами змінну можна посилатися %location %. Якщо це не те, що ви хочете, видаліть зайве місце у визначенні.


7
Якщо пробіл раніше =інтерпретується як частина імені, тоді змінну не можна посилати як %location%, на неї слід посилатися як %location %. Це помилка?
Жалюгідна змінна

7
@ Мізерна змінна: ти маєш рацію; здається, що оригінальна відповідь стала жертвою неправильного редагування.
Брайан Ніксон

18
Тож ось з чим прийшла МС
Falaque,

5
@Falaque На відміну від alias x = yземлі * nix?
Основні

1
@Falaque, так що ви думаєте, що Баш буде робити під час бігу x = y?
phuclv

263

Проміжки значні. Ви створили змінну, названу 'location ' зі значенням
' "bob"'. Примітка - додані одиничні лапки додано для відображення місця простору.

Якщо ви хочете, щоб котирування були у вашому значенні, то ваш код повинен виглядати так

set location="bob"

Якщо ви не хочете цитати, то ваш код повинен виглядати так

set location=bob

Або ще краще

set "location=bob"

Останній синтаксис запобігає потраплянню значення у ненавмисні пробіли, а також захищає від спеціальних символів, наприклад & |тощо.


8
Чи є недоліки останнього синтаксису?
Вовк

8
@Wolf - Ні, немає і недоліків. Однак існує обмеження, коли це найефективніше. Поки значення не містить лапок, то майже будь-які символи можуть з’являтися у значенні, не турбуючись про те, щоб уникнути. Винятки становлять %і, можливо !, увімкнено затримку розширення. Але якщо значення дійсно містить лапки, то ви повинні турбуватися про те, коли , щоб уникнути отруєних символи , такі як |, &і т.д.
dbenham

1
це здається таким же, як встановлення змінної середовища у Windows. Це єдиний спосіб використання локальних змінних у пакетних скриптах?
парашувати

1
@Wolf, потрібно лише переконатися, що розширення команд увімкнено, але все одно це конфігурація за замовчуванням ...
aschipfl

7

вхід location.bat

@echo off
cls

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

вихід

We're working with bob

(помилки, зроблені: spaceі " ")


4
set /pзапрошує користувача та зберігає відповідь у вказаній змінній. наприклад,set /p name="What is your name? " & echo Hello, %name%.
Роберт Муні

6
-1, Синтаксис set /p "varname"="text"невірний, він створює змінну з назвою location"(з кінцевою цитатою!). Це повинно бути set /p location="bob". Але навіть тоді це вже не відповідає питанню
jeb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.