에서 알 수 있듯이 in call /?
변수 ~
(예: %~d1
)는 파일 경로(여기서는 드라이버)의 일부를 구문 분석하는 데 사용되지만 여기에서는 물결표가 다른 컨텍스트에서 사용됩니다.https://www.tutorialspoint.com/batch_script/batch_script_string_length.htm:
@echo off
set str = Hello World
call :strLen str strlen
echo String is %strlen% characters long
exit /b
:strLen
setlocal enabledelayedexpansion
:strLen_Loop
if not "!%1:~%len%!"=="" set /A len+=1 & goto :strLen_Loop
(endlocal & set %2=%len%)
goto :eof
여기서 이 변수 확장의 의미는 무엇입니까 "!%1:~%len%!"
? 그리고 빈 문자열과 비교하여 문자열의 길이를 어떻게 계산합니까? 여기서 물결표의 목적은 무엇입니까? 더욱이 이 예제는 출력이 있는 곳 if not "!str:~136!" == "" set /A len+=1 & goto :strLen_Loop
(숫자가 증가하는 곳 ) 을 무한 루프에 빠지게 합니다 !str:~n
.
답변1
물결표(~) 기호는 배치 파일에서 다양한 방식으로 사용됩니다.
인수 인용 제거. 명령줄 인수(예: "%~1") 앞의 물결표 기호는 매개 변수에서 주변 따옴표를 제거한다는 것을 나타냅니다. 예를 들어 %1의 값이 "Hi"이면 %~1은 Hi로만 확장됩니다.
하위 문자열 처리. 배치 파일의 문자열 변수에서 하위 문자열을 추출하는 방법이 있습니다. 구문은 다음과 같습니다
%variable:~num_chars_skip,num_chars_keep%
. 건너뛰기 문자 수는 문자열에서 시작할 지점 또는 문자열 변수 앞의 문자 수를 제외하는 지점을 의미합니다. 그리고 num chars to keep은 시작점 이후의 문자 수를 나타냅니다. 유지할 문자 수는 선택 사항이지만 첫 번째는 필수입니다. 유지할 문자 수를 지정하지 않은 경우 해당 문자를 유지할 문자 수만 구문 분석됩니다.
추가 도움말을 보려면 명령 프롬프트에서 다음 내용을 읽어야 합니다.
call /?
for /?
set /?
도움이 되었기를 바랍니다
답변2
노력하다 set /?
:
...
환경 변수 대체가 다음과 같이 향상되었습니다.%PATH:str1=str2%
PATH 환경 변수를 확장하여 확장된 결과에서 "str1"의 각 항목을 "str2"로 대체합니다. "str2"는 확장된 출력에서 "str1"의 모든 항목을 효과적으로 삭제하기 위한 빈 문자열일 수 있습니다. "str1"은 별표로 시작할 수 있습니다. 이 경우 확장된 출력의 시작 부분부터 str1의 나머지 부분이 처음 나타나는 부분까지 모든 내용이 일치합니다.
확장을 위한 하위 문자열을 지정할 수도 있습니다.
%PATH:~10,5%
PATH 환경 변수를 확장한 다음 확장된 결과의 11번째(오프셋 10) 문자에서 시작하는 5자만 사용합니다. 길이를 지정하지 않으면 변수 값의 나머지 부분이 기본값으로 사용됩니다. 숫자(오프셋 또는 길이) 중 하나가 음수인 경우 사용되는 숫자는 지정된 오프셋 또는 길이에 추가된 환경 변수 값의 길이입니다.
%PATH:~-10%
PATH 변수의 마지막 10자를 추출합니다.
%PATH:~0,-2%
PATH 변수의 마지막 2자를 제외한 모든 문자를 추출합니다.
...
그만큼행동매우 유용하지만설명음수에 대한 설명은 혼란스럽고 부정확합니다. 첫 번째 숫자(오프셋)는 정확합니다. 문자를 %VAR:~N%
뺀 끝에서 시작합니다 N
. 음수를 사용하는 경우두번째숫자, 더 이상 하위 문자열이 아닙니다.길이, 그러나 종료되기 전에 중지할 문자 수로 해석됩니다.값, 길이에 관계없이. 따라서 %VAR:~1,-1%
첫 번째 문자와 마지막 문자를 제외한 값을 제공하고 둘 다 %VAR:~-2,-1%
마지막 %VAR:~-2,1%
문자 옆에 제공합니다.
답변3
- 이 튜토리얼 코드를 "수정"하고 주석에 인용된 루프 무한을 방지하려면 다음을 수행하십시오.
알겠습니다. 하지만 아직 내 컴퓨터에서는 종료하려면 ^C가 필요합니다. 136자로 된 길이나 단어가 없음에도 불구하고 내가 얼마나 큰 숫자인 136을 얻는지 보세요.- @목자
@echo off && setlocal enabledelayedexpansion
set "_str=Hello World" & call :strLen_Loop str
:strLen_Loop
if "%~1" == "" (
endlocal & goto :EOF
) else if not "!_%~1:~%_len%!" == "" (
set /A "_len+=1" & goto=:strLen_Loop
) else echo\String is !_len! characters long & exit /b