2017-03-08 2 views
2

Windows 배치 프로그래밍에서 일부 하위 문자열을 수행하려고하는데 Linux 스크립팅만큼 쉽지 않은 것 같습니다.Windows 배치 프로그래밍에서 변수 사용

다음은 제 코드입니다.

set ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download -Dhello.type=DDDDD 
set START_INDEX=34 
set END_INDEX=51 
SET newStr=%ENV_STRING:~%START_INDEX%,%END_INDEX%% 

START_INDEX 및 END_INDEX는 사용자가 제공 할 ENV_STRING에 따라 변경됩니다. START_INDEX 및 END_INDEX에 정적 변수를 사용하여 이러한 변수가 사용되었음을 보여줍니다. ENV_STRING에서 hello.alt.dir의 값을 추출하기 만하면됩니다.

newStr을 출력 할 때 문자열을 부분 문자열로 처리하지 않습니다.

누군가가 잘못된 부분을 지적 할 수 있습니까?

감사합니다.

+0

질문이 확실하지 않으므로 원하는 결과를 제시하십시오. – jfatal

+0

ENV_STRING에서 '-Dhello.alt.dir'의 값인 'C : \ Works \ download'만 추출하고 싶습니다. – user826323

+1

지연된 확장이있는'SET newStr =! ENV_STRING : ~ % START_INDEX %, % END_INDEX %!'또는'CALL SET newStr = %% ENV_STRING : ~ % START_INDEX %, % END_INDEX %%%'를 사용하십시오. [이 답변] (http://stackoverflow.com/questions/10166386/arrays-linked-lists-and-other-data-structures-in-cmd-exe-batch-script/10167990#10167990)을 읽어 보시기 바랍니다. 주제가 다르긴하지만이 관리에 대해 설명합니다. – Aacini

답변

2

당신은 코드를 사용할 수 있습니다 :

@echo off 
set "ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download - Dhello.type=DDDDD" 
set "START_INDEX=34" 
set "END_INDEX=51" 
setlocal EnableDelayedExpansion 
set "newStr=!ENV_STRING:~%START_INDEX%,%END_INDEX%!" 
endlocal & set "newStr=%newStr%" 

변수 참조 내 START_INDEX 또는 END_INDEX 같은 환경 변수의 값을 참조 할 수 없습니다. Windows 명령 인터프리터가 변수 참조를 해석하지 못합니다.

솔루션은 위의 코드 에서처럼 대체가 적용되는 변수에 지연된 확장을 사용하고 시작 및 끝 인덱스 참조에 대해 즉시 확장을 사용합니다.

그러나이 SETLOCALnewStr 더 이상 현재의 환경 변수 목록을 폐기하고 이전 변수 목록을 복원 명령 ENDLOCAL 후 존재하지 않을 현재 환경 변수의 복사본 따라서 환경 변수를 작성하는 명령. 이 솔루션은 ENDLOCALSET을 한 줄에 즉각적인 변수 확장과 함께 사용합니다.

BTW : 문자열 분할은 일반적으로 for /F을 사용하는 Windows 배치 스크립트에서 수행됩니다.

2

이렇게보십시오가 실행될 때 발현을 평가한다 ! 동봉 지연 확장 및 변수

setlocal enableDelayedExpansion 
set ENV_STRING=-Dhello.env=hello -Dhello.alt.dir=C:\Works\download -Dhello.type=DDDDD 
set START_INDEX=34 
set END_INDEX=51 
SET newStr=!ENV_STRING:~%START_INDEX%,%END_INDEX%! 
echo -%newStr%- 

(즉 지연). %으로 묶인 변수는 즉시 대체됩니다. 따라서 % 충돌을 피할 수 있습니다.

관련 문제