다른 CMD 인스턴스를 호출하고 상위 인스턴스에서 데이터를 전달하려고 합니다.
나는 변수를 사용하는 일반적인 경로를 알고 있지만, endlocal 및 브리징이 너무 불편할 것이기 때문에 이 경우에는 실현 가능하지 않습니다(수십 개의 변수를 전달해야 함). 또한 임시 파일을 사용하여 원하는 모든 데이터를 쉽게 포팅할 수 있지만 이렇게 하면 원치 않는 발자국이 남게 된다는 것도 알고 있습니다. 편집: setx도 매우 성공적으로 사용할 수 있습니다.
내가 찾고 있어요구체적으로다음과 같이 인수의 일반적인 사용에 따른 것입니다.
test.bat -setvar"variable"="value" -setvar...
나는 이전에 한계가 있는 한 가지 방법을 찾았습니다.
다른 스레드에서 start cmd 끝에 명령을 추가할 수 있다는 것을 알았습니다.
start cmd /c call "test.bat" ^& PAUSE
물론 우리는 이것을 뒤집을 수 있습니다
start cmd /c call PAUSE ^& TIMEOUT 5 ^& PAUSE ^& test.bat
명령에는 "" 및 특수 문자가 포함될 수 없습니다. 이는 복잡한 변수를 이식하려고 할 때 문제를 나타냅니다.
특수 문자에 대해 말하자면:
start cmd /c call (PAUSE) ^& (TIMEOUT 5) ^& (REM !"#¤%&/=?`´^*"-.,_:;\*~¨) ^& test.bat
이것은 전혀 작동하지 않습니다. 해석을 피할 수는 있지만 일부 변수의 경우 처리할 수 있는 모든 값으로 처리할 수 있을 만큼 값을 충분히 알지 못할 수도 있습니다. -- 실제로 괄호는 허용되지 않는 것 같습니다.
내가 해야 할 주요 작업 중 하나는 볼륨 이름을 전달하는 것입니다. 이는 쉽게 달성할 수 있지만 이것만으로는 충분하지 않습니다.
start cmd /c call echo \\?\Volume{6537febd-01bc-11d6-adb5-806e6f6e6963}\ ^& TIMEOUT 5 ^& PAUSE ^& test.bat
이 내용은 이미 다른 곳에서 다루었을 수 있으며 그렇다면 관련 스레드에 대한 올바른 키워드나 유사점을 찾지 못하는 것이 문제입니다.
답변1
하위 cmd
인스턴스상속하다상위 환경 변수의 모든 환경 변수. 증명: 두 개의 배치 스크립트를 생성해 보겠습니다.
Test1.bat
@setlocal
@set _batch
@set "_batchParentName=%~nx0"
@set "_batchParentPath=%~dp0"
@set "_batchParentSpec=< LSS > GTR & amper | pipe"
start "%~n0" cmd /C call "test.bat" "%_batchParentSpec%" %* ^& pause
@set _batch
Test.bat
@setlocal
@set _batch
@echo %~n0: %%* = %*
상위 cmd
인스턴스 출력:
d:\bat>test1.bat first "1<2" third
Environment variable _batch not defined
d:\bat>start "test1" cmd /C call "test.bat" "< LSS > GTR & amper | pipe" first "1<2" third
& pause
_batchParentName=test1.bat
_batchParentPath=D:\bat\
_batchParentSpec=< LSS > GTR & amper | pipe
d:\bat>
다음의 하위 cmd
인스턴스 출력 test.bat
:
_batchParentName=test1.bat
_batchParentPath=D:\bat\
_batchParentSpec=< LSS > GTR & amper | pipe
test: %* = "< LSS > GTR & amper | pipe" first "1<2" third
Press any key to continue . . .
오른쪽 메모start
명령 구문와 함께 "title"
:
START "title" [/D path] [options] "command" [parameters]
항상 TITLE을 포함하세요. 이는 "My Script"와 같은 간단한 문자열이거나 빈 따옴표 "" 쌍일 수 있습니다. Microsoft 설명서에 따르면 제목은 선택 사항이지만 선택한 다른 옵션에 따라 제목을 생략하면 문제가 발생할 수 있습니다.
보장하다명령start
하지 않습니다옵션 스위치 포함 /I
( start /?
):
/I The new environment will be the original environment passed
to the cmd.exe and not the current environment.
하위 환경 변경으로 인한 또 다른 상황을 방지하려면 다음과 같이 /D
스위치를 포함하십시오.cmd
start "test1" cmd /D /C call "test.bat"
다음과 같이 cmd /?
:
/D Disable execution of AutoRun commands from registry
답변2
setx
창에 전역적인 환경 변수를 설정하는 데 사용할 수 있습니다 .
사용하려면 setx
간단히 다음과 같이 작성하세요. setx "name" "variable"
여기서 name은 간단한 이름이고,variable은 설정하려는 변수입니다.
setx /?
옵션에 대해 좀 더 자세히 알고 싶다면 모든 옵션과 매개변수를 참조하세요 .
하지만 setx는 현재 사용자의 레지스트리 하이브에 변수를 직접 저장한다는 점에 유의하세요. 이는 관리 권한이 필요하지 않지만 현재 cmd 세션에서 변수를 직접 사용할 수 없음을 의미합니다. set
변수를 로컬에 저장하려면 일반을 사용하십시오 .
물론 다음 예와 같이 지역 변수를 전역 변수에 저장할 수도 있습니다.
@echo off
:: store "test" in variable "a"
set a=test
:: make this variable global
setx a %a%
위의 예에서 볼 수 있듯이, %a%
로컬 범위의 변수를 참조하고 setx는 이를 공개적으로 사용 가능하게 만듭니다.
전역 변수를 설정 해제하려면 다음 명령을 호출하세요. setx "name" ""
예:setx a ""
또한 알아두면 좋은 점은 setx를 사용하여 cmd의 한 인스턴스를 다른 인스턴스에서 수정할 수 없다는 것입니다. cmd 창을 시작하자마자 set만이 내부에서 변수를 변경할 수 있고 setx는 변수를 외부에 저장할 수 있습니다. (퇴장 시 원하는 대로)