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

75

В Bash я могу сделать EDITOR=vim commandи commandбуду работать с EDITORустановленным значением vim, но это не повлияет на значение EDITORв самой оболочке. Возможно ли сделать это в cmd.exe?

Алексей романов
источник

Ответы:

53

Обратите внимание, 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

Как отмечено ниже по maoizm , это 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 раза) и версию в длинной и сложной командной строке, вы можете редактировать их в начале указанной команды. Проще / проще манипулировать и изменять значения параметров.

VonC
источник
1
Протестировал его на моей машине с Windows 10 версии 1607, приглашение cmd вылетает.
Фернандо Коста Бертольди
Обратите внимание, что EDITOR не будет установлен, 'vim'но 'vim 'в последней команде. Добавьте внутренние кавычки, чтобы избежать пробела в конце.
Цитракс
@Zitrax Верно! Я отредактировал ответ соответственно.
VonC
1
NB: интересно: порядок переключателей имеет значение в этом случае. cmd /v/c "..." работает, но cmd /c/v "..."не получается - надеюсь, это
поможет
1
@DerekGreer "Я не могу придумать ни одной практической причины": хорошо, я отредактировал ответ, чтобы добавить практическую причину.
VonC
50

Вы можете сделать это в Windows, как это, не нужно ничего устанавливать.

cmd /C "set EDITOR=vim && set"

Вы увидите список переменных и увидите EDITOR = vim, теперь снова запустите «set», и его не будет в списке.

Вы можете сделать несколько && для добавления дополнительных команд:

cmd /C "set EDITOR=vim && do this && do that && otherstuff"

РЕДАКТИРОВАТЬ: / C выходит из нового cmd сразу после запуска, если вы производите вывод с новым, он все еще будет виден в родительском окне.

Вы можете использовать / K, и в этом случае новое окно cmd остается открытым в конце цикла.

Viper_Sb
источник
5
Быть осторожен. Установка переменной таким образом приведет к появлению пробела в переменной EDITOR: "vim". Чтобы избежать пробела, используйте: cmd / C "set" EDITOR = vim "&& do this && do this"
Герд К
1
Это не работает на «Windows Server 2008», например. Я попробовал это: установить имя = "имя пользователя" && echo% username%. И имя пользователя пусто.
Акозин
@akozin Ты понимаешь, что ты получил значение ключа назад? Вы имели в виду set name=foo&&echo %name%или set username=foo&&echo %username%?
Phrogz
@akozin см. мой ответ ниже
VonC
7

вы можете использовать перенесенный envутилит из пакета CoreUtils в GnuWin32 http://gnuwin32.sourceforge.net/

  1. Настройте это
  2. Проверьте, какой каталог env.exeсуществует в переменной% PATH%
  3. Используйте так же, как версия для Linux env EDITOR=vim command
Красная Скотина
источник
возможно стоит сказать, что если у вас есть git / docker / msys / cygwin, у вас уже есть версия этого.
ксенотеррацид
3

Я поднял пакетный файл, 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цикле (потребуется отложенное расширение).

AFH
источник
Почему бы просто не использовать %*в качестве предпоследней строки (т. Е. Строку после :DoCmdметки), чтобы учесть очень длинные пользовательские команды?
Скотт
@Scott - потому что %*это оригинальный список параметров: он не подвержен влиянию shift(в отличие от $*Unix).
AFH