Windows cmd.exe에서 동일한 명령 줄 내에서 변수 설정 및 사용


75

배쉬에서, 내가 할 수 EDITOR=vim commandcommand함께 실행됩니다 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
주의 : 흥미로운 :이 경우 스위치 순서가 중요합니다. cmd /v/c "..." 작동하지만 cmd /c/v "..."실패-잘하면 15 분을 절약 할 수 있습니다.
maoizm

1
@DerekGreer "실제적인 이유는 생각할 수 없습니다": 네, 실용적인 이유를 추가하기 위해 답을 편집했습니다.
VonC

50

아무것도 설치하지 않아도 이와 같은 창에서 할 수 있습니다.

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

변수 목록이 표시되고 EDITOR = vim이 표시됩니다. 이제 "set"을 다시 실행하면 나열되지 않습니다.

여러 개의 &&를 사용하여 추가 명령을 추가 할 수 있습니다.

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

편집 : / C는 실행 직후 새 cmd를 종료합니다. 새 출력으로 출력을 생성하면 부모 창에 여전히 표시됩니다.

/ K를 사용하도록 선택할 수 있으며,이 경우 실행이 끝날 때 새 cmd 창이 열린 상태로 유지됩니다.


5
조심해. 이 방법으로 변수를 설정하면 변수 EDITOR에 "vim"이라는 공백이 생깁니다. 후행 공백을 피하려면 : cmd / C "set"EDITOR = vim "&& 이것을 수행하고 && 그렇게하십시오"
Gerd K

1
예를 들어 "Windows Server 2008"에서는 작동하지 않습니다. 나는 이것을 시도했다 : set name = "username"&& echo % username %. 그리고 사용자 이름이 비어 있습니다.
akozin

@akozin 키 값이 거꾸로 있다는 것을 알고 있습니까? 당신은 의미했다 set name=foo&&echo %name%set username=foo&&echo %username%?
Phrogz


7

envGnuWin32 http://gnuwin32.sourceforge.net/의 CoreUtils 패키지에서 이식 된 util 을 사용할 수 있습니다.

  1. 그것을 설정
  2. env.exe% PATH % 변수에 존재 하는 디렉토리 확인
  3. 리눅스 버전과 같은 방식으로 사용 env EDITOR=vim command

아마도 git / docker / msys / cygwin이 있다면 이미 이것의 버전을 가지고있을 것입니다.
xenoterracide

3

나는 env.cmd리눅스 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]

배치 파일은 for루프 내에 명령 문자열을 작성하여 8 매개 변수 제한을 제거하기 위해 정교해질 수 있습니다 (지연된 확장이 필요함).


매우 긴 사용자 명령을 허용하기 위해 %*두 번째 줄 (예 : :DoCmd레이블 다음 줄)로 사용하지 않는 이유는 무엇 입니까?
Scott

@Scott 때문에 - %*은 IS 원래 파라미터리스트 :이 영향을받지 않는다 shift(달리 $*유닉스).
AFH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.