Установите значение переменной с результатом команды в командном файле Windows - PullRequest
94 голосов
/ 20 мая 2009

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

var=$(command -args)

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

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

set var=`command -args`

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

set var=command -args

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

Ответы [ 4 ]

59 голосов
/ 20 мая 2009

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

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

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

33 голосов
/ 22 августа 2012

Нужно быть несколько осторожнее, так как пакетная команда 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 может быть причиной незначительных ошибок.

17 голосов
/ 21 мая 2009

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

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

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

12 голосов
/ 20 мая 2009

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

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

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

Microsoft Windows [Version 6.0.6001]

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...