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


98

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

var=$(command -args)

де varзмінна, встановлена ​​командою command -args. Тоді я можу отримати доступ до цієї змінної як $var.

Більш звичайний спосіб зробити це, сумісний майже з кожною оболонкою Unix, це:

set var=`command -args`

Однак, як я можу встановити значення змінної за результатами команди у пакетному файлі Windows ? Я спробував:

set var=command -args

Але я вважаю, що varце налаштовано command -argsне на вихід команди.

Відповіді:


62

Щоб зробити те, що описує Джессі , з пакетного файлу 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" встановлює значення "результат" значення першого рядка (тільки) в "__query.tmp" через оператора перенаправлення "<".


14

Єдиний спосіб, коли я це бачив, це зробити, якщо це зробити:

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

ver це команда версії для Windows, і в моїй системі вона виробляє:

Microsoft Windows [Version 6.0.6001]

Джерело


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.