Пакетные файлы Windows: как установить переменную с результатом команды?

В среде bash я обычно делаю:

var=$(command -args)

а я использую $var со значением, заданным в результате команды. То же самое относится к более традиционным

set var=`command -args`

совместим почти в каждой оболочке unix.

Как я могу определить переменную в файле bat bat Windows? Я пробовал

set var=command -args

но я получаю только строку "command -args".

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

theValue=`command`

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

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

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

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

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

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

Ответ 3

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

sqlplus -S schema/[email protected] @query.sql> __query.tmp
set /p result=<__query.tmp
del __query.tmp

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

Ответ 4

Единственный способ, которым я это видел, - это сделать это:

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

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

Microsoft Windows [Version 6.0.6001]

Источник