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?

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.


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.


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


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

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).


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.