
에 대한 답변이전 질문이 FOR 줄을 제안합니다. 이제 변수를 사용하려고합니다. 현재 내 배치 스크립트는 다음과 같습니다.
@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 %%G
:sub1
echo %%G
set apath=%%~G
echo %apath%
goto :eof
:End
이 스크립트의 출력은 다음과 같이 7번 반복됩니다.
%G
%~G
서브루틴이 변수에 대해 뭔가를 하고 있는 것 같습니다. 왜냐하면 내가 다음 줄을 대체할 때:
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do (
echo %%G
set apath=%%~G
echo %apath%
)
원하는 결과를 얻었습니다. 이러한 성격의 출력 6쌍은 다음과 같습니다.
"3D Objects"
3D Objects
예상대로 물결표는 따옴표를 제거합니다.
첫 번째 코드 샘플에서 7쌍(6개가 아님)의 출력 행이 생성된다는 것은 서브루틴이 따옴표를 무시하고 "3D"와 "개체"를 두 개의 별도 항목으로 렌더링할 수 있음을 나타냅니다. 이는 에서 해결된 문제였습니다.이전 질문.
나는 두 번째 코드 샘플(위)에 제시된 더 간단한 접근 방식을 사용하여 특정 결과를 달성하는 데 문제가 있었기 때문에 서브루틴 접근 방식을 수정하기 시작했습니다. 확장이 지연되면 문제가 해결될 수 있지만 복잡성이 더 커집니다. 서브루틴의 "goto :eof" 행이 작동하더라도 약간 혼란스럽다는 사실을 부정하지 마세요.
내 구체적인 질문은 서브루틴에서 사용될 때 변수에 어떤 문제가 발생하는가입니다. 그러나 더 좋은 방법이 있다면 적어도 그 방향으로의 링크라도 주시면 감사하겠습니다.
답변1
당신은~을 위한다음을 사용하여 서브루틴에 대한 루프 반복부르다따라서 해당 변수(전달된 변수 자리 표시자)를 큰따옴표로 묶은 다음 해당 서브루틴 내에서 전달된 변수를 참조하거나 %1
묶은 %~1
큰따옴표를 제거하려고 합니다.
호출된 각 서브루틴의 끝에서 를 사용하면 GOTO :EOF
원래 호출자 서브루틴으로 제어가 다시 전달되므로 명령 이후 적용 가능한 경우 나머지 논리를 계속 처리할 수 있습니다 call
.
@echo off
cls
for %%G in ("3D Objects","Documents","Downloads","Music","Pictures","Videos") do call :sub1 "%%~G"
goto :eof
:sub1
echo %1
set apath=%~1
echo %apath%
goto :eof
:End
산출
"3D Objects"
3D Objects
"Documents"
Documents
"Downloads"
Downloads
"Music"
Music
"Pictures"
Pictures
"Videos"
Videos
지원 리소스
- 을 위한
-
인수는 다음을 사용하여 서브루틴에 전달될 수도 있습니다.
CALL:
CALL :my_sub 2468
% 뒤에 명령줄의 숫자 위치를 사용하여 인수의 값을 얻을 수 있습니다. 전달된 첫 번째 항목은 항상 %1이고 두 번째 항목은 항상
%2
이런 식 입니다.%*
배치 스크립트에서 는 모든 인수(예: )를 참조하며 의%1 %2 %3 %4 %5
...%255
인수만 숫자로 참조할 수 있습니다.%1
%9
-
참조로 전달
명령줄에서 숫자 또는 문자열 값을 전달하는 것 외에도변하기 쉬운이름을 지정한 다음 변수를 사용하여 스크립트나 서브루틴 간에 데이터를 전송합니다. 참조로 전달하는 것은 약간 더 고급 기술이지만 문자열에 CMD 구분 기호나 따옴표가 포함되어 있는 경우 특히 유용할 수 있습니다.
서브루틴 호출(:label)
명령 은
CALL
지정된 매개변수와 함께 지정된 레이블 뒤의 명령문에 제어를 전달합니다.서브루틴을 종료하려면GOTO :eof
현재 서브루틴의 끝으로 제어권을 전송하도록 지정하십시오.. CALL /?
CALL command now accepts labels as the target of the CALL. The syntax is: CALL :label arguments In addition, expansion of batch script argument references (%0, %1, etc.) have been changed as follows: %* in a batch script refers to all the arguments (e.g. %1 %2 %3 %4 %5 ...) Substitution of batch parameters (%n) has been enhanced. You can now use the following optional syntax: %~1 - expands %1 removing any surrounding quotes (")