배치: 서브루틴에서 예상치 못한 변수 결과

배치: 서브루틴에서 예상치 못한 변수 결과

에 대한 답변이전 질문이 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

지원 리소스

  • 을 위한
  • 명령줄 인수(Parameters)

    인수는 다음을 사용하여 서브루틴에 전달될 수도 있습니다.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 (")
    

관련 정보