2013-02-04 2 views
2

가능한 간단한 상황 (솔루션이 아직 알려지지 않은 경우)에서 도움을 요청하고 싶습니다.일괄 스크립트에서 FOR주기의 IF 비교 연산자 대체

"동적"코드를 만들기 위해 if 명령에 대한 변수를 제공하려고하지만이 경우 다음과 같은 이유로 실패합니다. %이 시점에서 예기치 않게 발생했습니다. 여기

는 대한 간단한 예입니다 :

> for %i in (NEQ) do (if 1 %i 2 echo jo) 
%i was unexpected at this time. 

동안 마법처럼 다음 작품 :

>set oper=NEQ 
>for %i in (NEQ) do (if 1 %oper% 2 echo works) 
works 

나는 for 루프를 유지해야한다 (그리고 나는에서 실제 운영자를 얻을으로 루프에 대한 실제 코드), 난 정말 그것을 해결하는 방법에 붙어있다 ...

뿐만 아니라,하지만 EnableDelayedExpansion과 함께 놀려고 했어! 변수! 연산자 대신에 거부됩니다. 스크립트에 큰 수정을하지 않고 IF 용 변수를 FOR 루프에 제출하는 방법이 있습니까?

답변

3

IF 용 변수를 FOR 루프에 제출하는 방법이 있습니까?

아니요! IF 문은 자체 구문 분석기이므로이 구문 분석 단계에서 일부 토큰이 이미 확장되기를 기대합니다.
옵션을 확장하거나 연산자를 확장 할 수 없으며 NOT도 확장 할 수 없습니다.
그러나 지연 또는 FOR 변수를 사용하여 값을 확장 할 수 있습니다.

setlocal EnableDelayedExpansion 
set myOperator=EQU 
IF 1 %myOperator% 1 echo Works 
IF 1 !myOperator! 1 echo FAILS 
for %%O in (EQU) do IF 1 %%O 1 echo Works 

확대 비율은 IF 파서가 줄을 가져 오기 전에 확장되므로 작동합니다.

정말 변수 연산자를 사용해야하는 경우 함수를 사용해야합니다.

for %%O in (EQU) do call :myFunc %%O 
exit /b 

:myFunc 
IF ONE %1 ONE echo Works 
exit /b 

편집 :
그리고 특별한 파서는 여기에 IF 문에 대한 CALL 확장을 사용하는 것은 불가능 것을, 또한 원인이다. 이 아이디어

set myOperator=EQU 
CALL IF 1 %%myOperator%% 1 echo Works 

IF 1 EQU 1 echo Works으로 확장해야하지만, CALLIF의 조합처럼

은 항상 실패합니다.

+0

정보를 제공해 주셔서 감사합니다. 나는 권고 된 함수 메소드를 사용하려고 노력할 것이다. 다시 한번 감사한다. (첫 번째 코드가 작동하는지 확실하지 않으면 4 행에서 실패하고 5 행으로 진행할 수 없습니다 .4 행을 벗어나면 5 행이 실패합니다.) – user2039632

+0

예, 4 행 및 5 행은 둘 다 구문 오류를 생성하므로 작업하십시오. IF 파서는'! myOperator! '나'%% O'를 처리 할 수 ​​없으므로 에러를 던집니다. – jeb

+0

원본 코드를 크게 변경하지 않기 위해 (내가 공유 한 것은 원래 코드를 단순화하여 내 문제를 나타냄) 다른 FOR 명령을 사용하도록 수정했습니다.예를 들면 다음과 같습니다 : (NEQ) do ( )에 대한 for % i do (echo works works) ) ' – user2039632