выполнить две команды в одной строке windows cmd, одна команда - команда SET - PullRequest
6 голосов
/ 27 марта 2012

[цель]

Эта простая последовательность команд запускается ожидаемой в оболочке CMD Windows:

dir & echo hello

выведет список файлов и каталогов и выведет строку.

Однако следующая последовательность команд не выполняется должным образом (по крайней мере, для меня):

C:\Users\Administrator>set name=value & echo %name%
%name%

C:\Users\Administrator>echo %name%
value

C:\Users\Administrator>

Как мы видим, первое эхо не может получить среду.Не могли бы вы помочь прокомментировать?Любой комментарий будет оценен!

PS: ОС: Windows 7 X64 Home Pre

Ответы [ 2 ]

10 голосов
/ 28 марта 2012

Ваш результат связан с тем, что% name% раскрывается во время фазы синтаксического анализа, и вся строка разбирается сразу перед заданным значением.

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

1) используйте CALL для повторного анализа ECHO% NAME%:

set name=value&call echo %^name%

Я положил ^ между процентами на тот случай, если имя уже было определено до выполнения строки. Без каретки вы получите старое значение.

Примечание: ваша исходная строка имела пробел перед &, этот пробел будет включен в значение переменной. Вы можете предотвратить лишнее пространство, используя кавычки: set "name=value" &...

2) использовать отложенное расширение, чтобы получить значение во время выполнения, а не во время анализа. В большинстве сред расширение по умолчанию не включено. Вы можете включить отложенное расширение в командной строке, используя соответствующий параметр CMD.EXE.

cmd /v:on
set "name=value" & echo !name!

Задержанное расширение, безусловно, может использоваться в командной строке, но оно чаще используется в командном файле. SETLOCAL используется для включения отложенного расширения в пакетном файле (не работает из командной строки)

setlocal enableDelayedExpansion
set "name=value" & echo !name!
2 голосов
/ 05 августа 2015

Вы также можете использовать cmd /V /C/V для включения отложенного расширения).
Прекрасно установить переменную среды только для одной команды в Windows cmd.exe:

cmd /V /C "set "name=value" && echo !name!"
value

Обратите внимание на использование двойных кавычек в set "name=value", чтобы избежать лишних пробелов после value.
Например, без двойных кавычек:

cmd /V /C "set name=value && echo '!name!'"
'value '

Вы бынужно подумать, чтобы убрать пробел между value и &&:

cmd /V /C "set name=value&& echo '!name!'"
'value'

Но использование двойных кавычек делает присваивание более явным.

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