2013-01-24 2 views
0

내가이 입력 된 가치를 설정하지 않는 그것은 간단한 모든배치 스크립트는 변수가

set ifpath=C:\Program Files\App 

if exist %ifpath% SET ppath=C:\Program Files ELSE SET ppath=C:\Program Files(x86) 

echo "%ppath%\App" 

에서 작동하지 않습니다하지만 난 스크립트가 작동려고 시간을 보냈다. 그것은 울릴 때 ppath가 누락 된 채로 있습니다. 조건을 제거하고 단순히 ppath를 경로로 설정하면 표시됩니다.

목표는 프로그램 파일 (x86)이 있는지 여부를 감지하고 프로그램 파일 (있는 경우)이 있으면 프로그램 파일을 설치하는 것입니다.

답변

3

당신은 2 가지 문제가 있습니다.

1) %ifpath%은 공백을 포함해야하므로 인용해야합니다. 따옴표가 없으면 IF EXIST는 이름이 첫 번째 공백을 멈춘 것으로 간주합니다.

2) 일괄 처리 구문 분석기는 SET 명령의 값이 끝나는 시점을 알 수 없습니다. ELSE 절을 값의 일부로 취급합니다. 그것은 괄호로 쉽게 풀 수 있습니다.

set "ifpath=C:\Program Files\App" 
if exist "%ifpath%" (SET ppath=C:\Program Files) ELSE SET ppath=C:\Program Files(x86) 
echo "%ppath%\App" 

우리가 당신이 테스트를 반전하고 (x86) 버전을 시작 가정하자. 파서가 (x86)의 첫 번째 괄호에서 끝나는 값이라고 생각하기 때문에 괄호를 추가하는 것만으로는 문제를 해결할 수 없습니다. 즉,이 이스케이프으로 해결할 수 있습니다

set "ifpath=C:\Program Files(x86)\App" 
if exist "%ifpath%" (SET ppath=C:\Program Files(x86^)) ELSE SET ppath=C:\Program Files 
echo "%ppath%\App" 

아니면 더 좋은 방법은 따옴표를 사용하는 것입니다

set "ifpath=C:\Program Files(x86)\App" 
if exist "%ifpath%" (SET "ppath=C:\Program Files(x86)") ELSE SET "ppath=C:\Program Files" 
echo "%ppath%\App" 
1

은 당신이 뭔가를 할 수 있습니다 : iffor의 성운 범위는 저를 혼동하는 경우

if exist "%ifpath%" (call :PF) else (call :PFx86) 
:PF 
set "ppath=c:\Program Files" 
goto :EOF 
:PFx86 
set "ppath=c:\Program Files(x86)" 
goto :EOF 

는 가끔 그런 call 문을. 나는 그것이 hackish하고 낭비하다는 것을 인정한다. 그러나 그것은 당신의 인생에 반창고를 붙이고, 계속 전진하는 것에 멋지다. :)

+0

감사합니다! 그게 효과가있어! 그것은 내가 필요한 전부이다! :) – netrox

+0

@netrox - 그리 빠릅니다. 아직도 문제가 있습니다. IF 문은 항상 FALSE를 반환합니다. [내 대답] (http://stackoverflow.com/a/14511321/1012053)을 참조하십시오. – dbenham

+0

@dbenham - OK 괄호와 따옴표를 추가했습니다. : P – rojo

관련 문제