일괄 처리: 데이터를 새 CMD 인스턴스에 인수로 전달하는 방법

일괄 처리: 데이터를 새 CMD 인스턴스에 인수로 전달하는 방법

다른 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는 변수를 외부에 저장할 수 있습니다. (퇴장 시 원하는 대로)

관련 정보