Ustawianie i używanie zmiennej w tym samym wierszu poleceń w Windows cmd.exe

75

W Bash mogę zrobić EDITOR=vim commandi commandbędę działać z EDITORustawionym na vim, ale nie wpłynie to na wartość EDITORsamej powłoki. Czy można to zrobić w cmd.exe?

Aleksiej Romanow
źródło

Odpowiedzi:

52

Pamiętaj, że cmd /C "set "EDITOR=vim" && echo %EDITOR%"to nie zadziała.
Nie zrobiłbym tegocmd /C "setlocal ENABLEDELAYEDEXPANSION && set "EDITOR=vim" && echo !EDITOR!"

Jaką /Vopcją byłoby włączenie opóźnionego rozszerzania zmiennych środowiskowych za pomocą !ogranicznika.

C:\> cmd /V /C "set EDITOR=vim&& echo !EDITOR!"
vim

Jak wspomniano poniżej przez maoizm , to jest cmd /V /C, nie cmd /C /V (co nie działa)


Nie mogę wymyślić żadnego praktycznego powodu, dla którego kiedykolwiek chciałbyś tego w kontekście jednego polecenia

Zazwyczaj jest to potrzebne, gdy trzeba zastąpić wartość używaną wielokrotnie w długim wierszu polecenia.
Na przykład, aby wdrożyć plik w Nexusie (w wielu wierszach dla czytelności):

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

Zamiast konieczności zastępowania grupy, artefaktu (używanego 2 razy) i wersji w długim i złożonym wierszu poleceń, możesz edytować je na początku tego polecenia. Przejrzystsze / łatwiejsze do manipulowania i zmiany wartości parametrów.

VonC
źródło
1
Przetestowałem to na moim komputerze z systemem Windows 10 w wersji 1607, awaria polecenia cmd ulega awarii.
Fernando Costa Bertoldi,
Zauważ, że EDITOR nie będzie ustawiony na, 'vim'ale 'vim 'na ostatnim poleceniu. Dodaj cytaty wewnętrzne, aby na końcu uniknąć spacji.
Zitrax
@Zitrax Right! Odpowiednio zredagowałem odpowiedź.
VCC
1
Uwaga: interesujące: w tym przypadku kolejność przełączników ma znaczenie. cmd /v/c "..." działa, ale cmd /c/v "..."kończy się niepowodzeniem - mam nadzieję, że może zaoszczędzić 15 minut
maoizm
1
@DerekGreer „Nie mogę wymyślić żadnego praktycznego powodu”: OK, edytowałem odpowiedź, aby dodać praktyczny powód.
VonC
50

Możesz to zrobić w systemie Windows, bez potrzeby instalowania czegokolwiek.

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

Zobaczysz listę zmiennych i zobaczysz EDITOR = vim, teraz uruchom ponownie „set” i nie będzie na liście.

Możesz dodać wiele znaków &&, aby dodać dodatkowe polecenia:

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

EDYCJA: / C kończy pracę z nowym cmd od razu po uruchomieniu, jeśli utworzysz dane wyjściowe przy użyciu nowego, nadal będzie ono widoczne w oknie nadrzędnym.

Możesz zdecydować się na użycie / K, w którym to przypadku nowe okno cmd pozostaje otwarte na końcu przebiegu.

Viper_Sb
źródło
5
Bądź ostrożny. Ustawienie zmiennej w ten sposób spowoduje utworzenie przestrzeni śledzenia w zmiennej EDITOR: „vim”. Aby uniknąć końcowej spacji, użyj: cmd / C "ustaw" EDITOR = vim "i & zrób to i & zrób to
Gerd K
1
Nie działa to na przykład w „Windows Server 2008”. Próbowałem: set name = "nazwa użytkownika" && echo% nazwa użytkownika%. Nazwa użytkownika jest pusta.
akozin
@akozin Czy zdajesz sobie sprawę, że masz wartość klucza wstecz? Miałeś na myśli set name=foo&&echo %name%czy set username=foo&&echo %username%?
Phrogz
@akozin patrz moja odpowiedź poniżej
VonC
7

możesz użyć przeniesionego narzędzia envz pakietu CoreUtils w GnuWin32 http://gnuwin32.sourceforge.net/

  1. Skonfiguruj to
  2. Sprawdź, z jakiego katalogu env.exeistnieje zmienna% PATH%
  3. Użyj tego samego sposobu, co wersja Linux env EDITOR=vim command
Czerwona Skotina
źródło
być może warto powiedzieć, że jeśli masz git / docker / msys / cygwin, już masz wersję tego.
ksenoterrakid
3

Podniosłem plik wsadowy, env.cmdktóry działa mniej więcej tak, jak envpolecenie Linux : -

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

Jedyną różnicą jest to, że ze względu na sposób cmdanalizowania przypisania środowiska muszą być cytowane, więc twoje polecenie będzie:

env "EDITOR=vim" command [up to 8 parameters]

Plik wsadowy można opracować w celu usunięcia ograniczenia 8-parametrowego poprzez utworzenie ciągu poleceń w forpętli (konieczne będzie opóźnione rozszerzenie).

AFH
źródło
Dlaczego nie użyć po prostu %*jako przedostatniej linii (tj. Następnej po :DoCmdetykiecie), aby pozwolić na bardzo długie polecenia użytkownika?
Scott
@Scott - Ponieważ %*jest to oryginalna lista parametrów: nie ma na nią wpływu shift(inaczej niż $*w Uniksie).
AFH