Налаштування та використання змінної в одному командному рядку в Windows cmd.exe


75

У Bash я можу зробити EDITOR=vim commandі commandбуде запускатися з EDITORвстановленим на vim, але це не вплине на значення EDITORв самій оболонці. Чи можливо це зробити в cmd.exe?

Відповіді:


52

Зауважте, що 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 рази) та версію у довгий і складний командний рядок, ви можете редагувати їх на початку вказаної команди. Чіткіше / простіше маніпулювати та змінювати значення параметрів.


1
Випробував його на моїй машині з Windows 10 версії 1607, cmd підказка виходить з ладу.
Фернандо Коста Бертолді

Зауважте, що EDITOR не буде встановлено на, 'vim'а 'vim 'в останній команді. Додайте внутрішні лапки, щоб уникнути місця в кінці.
Zitrax

@Zitrax Правильно! Відповідь я відредагував відповідно.
VonC

1
NB: Цікаво: порядок перемикачів має значення в даному випадку. cmd /v/c "..." працює, але cmd /c/v "..."не вдається - сподіваємось, це може заощадити 15 хвилин
маоїзм

1
@DerekGreer "Я не можу придумати жодної практичної причини": Гаразд, я відредагував відповідь, щоб додати практичну причину.
VonC

50

Ви можете це робити у таких вікнах, що немає необхідності нічого встановлювати.

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

Ви побачите список змінних, і ви побачите EDITOR = vim, тепер знову запустіть "set" і він не буде в списку.

Ви можете зробити кілька &&, щоб додати додаткові команди:

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

EDIT: / C виходить з нового cmd відразу після запуску, якщо ви виведете вихід з новим, він все одно буде видно у батьківському вікні.

Ви можете вибрати, щоб використовувати / K, в цьому випадку нове вікно cmd залишається відкритим наприкінці запуску.


5
Будь обережний. Якщо встановити змінну таким чином, це призведе до пробілу в змінній EDITOR: "vim". Щоб уникнути пробілу, використовуйте: cmd / C "встановіть" EDITOR = vim "&& зробіть це && зробіть це"
Gerd K

1
Наприклад, це не працює на "Windows Server 2008". Я спробував це: set name = "username" && echo% username%. І ім’я користувача порожнє.
акозін

@akozin Ви розумієте, що ви отримали ключове значення назад? Ви мали на увазі set name=foo&&echo %name%або set username=foo&&echo %username%?
Фрогз

@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циклі (знадобиться відкладене розширення).


Чому б просто не використовувати %*як передостанню лінію (тобто, рядок після :DoCmdмітки), щоб передбачити дуже довгі команди користувача?
Скотт

@Scott - Тому що %*це оригінальний список параметрів: він не схильний до shift( в відміну від $*в Unix).
AFH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.