![Установка и использование переменной в одной командной строке в Windows cmd.exe](https://rvso.com/image/1259401/%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0%20%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9%20%D0%B2%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%BD%D0%BE%D0%B9%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B5%20%D0%B2%20Windows%20cmd.exe.png)
В Bash я могу сделать EDITOR=vim command
и command
будет запущен с EDITOR
установленным значением vim
, но это не повлияет на значение EDITOR
в самой оболочке. Возможно ли сделать это в cmd.exe
?
решение1
Обратите внимание, что это cmd /C "set "EDITOR=vim" && echo %EDITOR%"
не сработает.
И не сработаетcmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"
Вам понадобится:
- опция
/V
, позволяющая включить отложенное расширение переменной среды с использованием!
в качестве разделителя. - без пробела между командой и
&&
(или добавьте кавычки)
То есть:
C:\> cmd /V /C "set EDITOR=vim&& echo '!EDITOR!'"
'vim'
# or
C:\> cmd /V /C "set "EDITOR=vim" && echo '!EDITOR!'"
'vim'
Какотмечено нижекмаоизм, это cmd /V /C
,нет cmd /C /V
(которые бынетработа)
Я не могу придумать ни одной практической причины, по которой вам когда-либо могло бы понадобиться это в контексте одной команды.
Обычно это нужно, когда нужно заменить значение, используемое несколько раз в длинной командной строке.
Например, чтобы развернуть файл на Nexus (в несколько строк для удобства чтения):
cmd /v /c "set g=com.agroup&& set a=anArtifact&& set v=1.1.0&& \
mvn deploy:deploy-file -Dfile=C:\path\!a!-!v!.jar \
-Dpackaging=jar -DgroupId=!g! -DartifactId=!a! -Dversion=!v! \
-DrepositoryId=nexus
-Durl=http://myserver/nexus/content/repositories/my-repo/"
Вместо того, чтобы заменять группу, артефакт (используется 2 раза) и версию в длинной и сложной командной строке, вы можете редактировать их вначалоуказанной команды. Манипулировать и изменять значения параметров становится понятнее/легче.
решение2
Вы можете сделать это в таких окнах, не требуя установки чего-либо.
cmd /C "set EDITOR=vim && set"
Вы увидите список переменных, в котором будет EDITOR=vim, теперь снова запустите «set», и переменная исчезнет из списка.
Вы можете использовать несколько операторов &&, чтобы добавить дополнительные команды:
cmd /C "set EDITOR=vim && do this && do that && otherstuff"
EDIT: /C завершает работу новой команды сразу после запуска, если вы создаете вывод с помощью новой команды, он все равно будет виден в родительском окне.
Вы можете использовать параметр /K, в этом случае новое окно cmd останется открытым по окончании выполнения.
решение3
вы можете использовать портированную утилиту env
из пакета CoreUtils в GnuWin32http://gnuwin32.sourceforge.net/
- Настройте его
- Проверьте, какой каталог
env.exe
существует в переменной %PATH% - Использовать так же, как и версию для Linux
env EDITOR=vim command
решение4
Я создал пакетный файл env.cmd
, который работает более или менее как команда Linux env
:-
echo off
setlocal
for %%f in (%*) do (
echo %%f|find "=" >nul:
if errorlevel 1 goto DoCmd
set %%f
shift
)
:DoCmd
%1 %2 %3 %4 %5 %6 %7 %8 %9
endlocal
Единственное отличие состоит в том, что из-за особенностей cmd
синтаксического анализа назначения окружения необходимо заключать в кавычки, поэтому ваша команда будет выглядеть так:
env "EDITOR=vim" command [up to 8 parameters]
Пакетный файл можно доработать, чтобы снять ограничение в 8 параметров, создав командную строку внутри for
цикла (потребуется отложенное расширение).