Установка и использование переменной в одной командной строке в Windows cmd.exe

Установка и использование переменной в одной командной строке в Windows cmd.exe

В 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/

  1. Настройте его
  2. Проверьте, какой каталог env.exeсуществует в переменной %PATH%
  3. Использовать так же, как и версию для 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цикла (потребуется отложенное расширение).

Связанный контент