2011-02-17 5 views
2

나는 내 시간을 먹어 치우는 어리석은 간단한 문제로 정신이 없습니다. 쉼표로 구분 된 문자열을 추가하려고하지만 쉼표가 추가되지 않습니다. 다음은 내 배치 파일 조각이다 : 나는 %MisingParams% 에코 때쉼표로 구분 된 문자열을 연결할 수 없습니다.

set MissingParams= 
set SwitchURL= 
set TrustStore= 
if 0%SwitchURL%==0 (set MissingParams=SwitchURL) 
    if 0%TrustStore%==0 (
    if not 0%MissingParams%==0 (  
     set MissingParams=%MissingParams%, 
    ) 
     set MissingParams=%MissingParams%TrustStore 
) 

이 스크립트를 도망 한 후, 예상 값은 SwitchURL,TrustStore이지만 단순히

SwitchURLTrustStore을 인쇄합니다. 디버깅을위한

D:\deleteme>echo %MissingParams% 
SwitchURLTrustStore 

, 내가 배치 파일에서 일부 에코 문을 도입 할 때, 그 결과는 더욱 희한하다 : 나는 위의 스크립트를 실행하면

set MissingParams= 
if 0%SwitchURL%==0 (set MissingParams=SwitchURL) 
    if 0%TrustStore%==0 (
    if not 0%MissingParams%==0 ( 
     echo MissingParams=%MissingParams% 
     set MissingParams=%MissingParams%, 
     echo MissingParams=%MissingParams% 
    ) 
    set MissingParams=%MissingParams%TrustStore 
    echo MissingParams=%MissingParams% 
) 

그것은

MissingParams=SwitchURL 
MissingParams=SwitchURL 
MissingParams=SwitchURL 

를 인쇄 명령 프롬프트에서 값을 반향 출력하면 이전과 같이 SwitchURLTrustStore

D:\deleteme>echo %MissingParams% 
SwitchURLTrustStore 

누구에게 아이디어가 있습니까? 이것은 끝까지 나를 좌절시키는 것입니다.

답변

3

이것은 표준 괄호/delayedExpansion 문제입니다.

괄호 블록이 실행되는 동안 (구문 분석하는 동안) 단순 규칙 %% %이 (가) 으로 확장되기 전에이 실행됩니다.

나중에 var 확장을해야하는 경우 지연 확장을 사용해야합니다.
세트로 표시 /?

setlocal EnableDelayedExpansion 
set MissingParams= 
set SwitchURL= 
set TrustStore= 
if 0!SwitchURL!==0 (set MissingParams=SwitchURL) 
    if 0!TrustStore!==0 (
    if not 0!MissingParams!==0 (  
     set MissingParams=!MissingParams!, 
    ) 
     set MissingParams=!MissingParams!TrustStore 
) 
+0

작동합니다. ! 변수는 무엇입니까! ? 나는 항상 % variable %를 사용했다. –

+0

지연된 확장 스타일로 ** set /? **에서 설명했습니다. – jeb

1

일종의 범위 지정 문제처럼 보입니다. 나는 작동하는 goto로 분기함으로써이 문제를 해결할 수있었습니다. 여기에 추가 디버그 쓰레기 내 버전이 :

@echo off 
set MissingParams= 
set SwitchURL= 
set TrustStore= 
if "%SwitchURL%"=="" (set MissingParams=SwitchURL) 
echo MissingParams1 is %MissingParams% 
if "%TrustStore%" EQU "" (GOTO :BRANCH1) 
:RESUME 
    echo MissingParams3 is %MissingParams% 
    set MissingParams=%MissingParams%TrustStore 
    echo MissingParams4 is %MissingParams% 
) 
echo MissingParamsF is %MissingParams% 
GOTO :eof 

:BRANCH1 
if "%MissingParams%" NEQ "" (set MissingParams=%MissingParams%,) 
GOTO RESUME 
관련 문제