Установите значение переменной с результатом команды в пакетном файле Windows

99

При работе в среде Bash , чтобы установить значение переменной в результате выполнения команды, я обычно делаю:

var=$(command -args)

где var- переменная, установленная командой command -args. Затем я могу получить доступ к этой переменной как $var.

Более традиционный способ сделать это, совместимый почти со всеми оболочками Unix:

set var=`command -args`

Тем не менее, как я могу установить значение переменной с результатом команды в пакетном файле Windows ? Я пробовал:

set var=command -args

Но я обнаружил, что varэто установлено, command -argsа не вывод команды.

Фрэнсис
источник

Ответы:

63

Чтобы сделать то, что описывает Джесси , из командного файла Windows вам нужно будет написать:

for /f "delims=" %%a in ('ver') do @set foobar=%%a 

Но вместо этого я предлагаю использовать Cygwin в вашей системе Windows, если вы привыкли к сценариям типа Unix.

Ник
источник
19
использовать for /f "delims=" %a in ('ver') do @set foobar=%aв командной строке. использование for /f "delims=" %%a in ('ver') do @set foobar=%%aв файлах сценария
georg
Легкая альтернатива - Gnu On Windows ( github.com/bmatzelle/gow/wiki ). Просто откройте командную строку и запустите bash. Затем вы можете писать команды bash. Вы также можете выполнять сценарии bash.
Натан
4
Обратите внимание, что если ваша команда включает канал, вам нужно экранировать его с помощью каретки, например: for / f "delims =" %% a in ('echo foobar ^ | sed -es / foo / fu /') do @ установить foobar = %% a
yoyo
35

Следует быть осторожным, поскольку пакетная команда Windows:

for /f "delims=" %%a in ('command') do @set theValue=%%a

не имеет той же семантики, что и оператор оболочки Unix:

theValue=`command`

Рассмотрим случай, когда команда не работает, вызывая ошибку.

В версии оболочки Unix присвоение "theValue" все еще происходит, любое предыдущее значение заменяется пустым значением.

В пакетной версии Windows ошибка обрабатывается командой for, а условие do никогда не достигается, поэтому любое предыдущее значение theValue будет сохранено.

Чтобы получить больше Unix-подобной семантики в пакетном сценарии Windows, вы должны убедиться, что выполняется присвоение:

set theValue=
for /f "delims=" %%a in ('command') do @set theValue=%%a

Невозможность очистки значения переменной при преобразовании сценария Unix в пакет Windows может быть причиной незначительных ошибок.

Джонатан Хедленд
источник
2
Спасибо за объяснение тонкой разницы между Windows и * nix.
Jeroen Wiert Pluimers
3
Также не забудьте экранировать любые специальные символы в command; например: for /f "delims=" %%a in ('command1 ^| command2') do set VAR=%%a.
Bill_Stewart
@Bill_Stewart, вы только что спасли мне день, на мгновение я подумал, что гораздо сложнее назначить вывод передаваемых по конвейеру команд переменной
MrBrody
19

Вот как я это делаю, когда мне нужны результаты запроса к базе данных в моем пакетном файле:

sqlplus -S schema/schema@db @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

Ключ находится в строке 2: «set / p» устанавливает значение «result» равным значению (только) первой строки в «__query.tmp» с помощью оператора перенаправления «<».

много
источник
14

Я видел это только так:

for /f "delims=" %a in ('ver') do @set foobar=%a

ver - это команда версии для Windows, и в моей системе она производит:

Microsoft Windows [Version 6.0.6001]

Источник

Джесси Диринг
источник