2012-07-18 6 views
15

Я пытаюсь написать заявление IF ELSE, вложенное в другое заявление IF. Вот что у меня есть:Вложенный IF (IF (...) ELSE (..)) оператор в пакете

IF %dirdive%==1 ( 
    IF DEFINED log (
     ECHO %DATE%, %TIME% >> %log% 
     FOR /R %root1% %%G IN (.) DO (
      SET _G=%%G 
      CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log% 
     ) 
     GOTO :end 
    ) ELSE ( 
     ECHO %DATE%, %TIME% 
     FOR /R %root1% %%G IN (.) DO (
      SET _G=%%G 
      CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2% 
     ) 
     GOTO :end 
    ) 
) 

Когда log не определен, я получаю:

The syntax of the command is incorrect. 
ECHO Wed 07/18/2012, 15:50:12.34 >> 

Aaaand Я в недоумении. Я пробовал играть со скобками. Я переместил последнее) на ту же строку, что и перед ней, и она не работает. Дело в том, прекрасно работает, когда определеноlog. Кажется, он разрывается сразу после или в IF %dirdive%==1, так как он не получит команду эха, вставленную сразу после этого.

ответ

14

источник вашей проблемы в том, что даже если ветвь оператора IF не выполняет, он все равно должен иметь действительный синтаксис.

Когда log не определен, то следующая строка

ECHO %DATE%, %TIME% >> %log% 

расширяется следующее при log неопределен

ECHO someDate, someTime >> 

Там нет имени файла после перенаправления, что приводит к синтаксису ошибка.

Пока переменная log еще не определена с ограждающих кавычки (если определено, что есть), то просто изменив строку следующим образом следует исправить:

ECHO %DATE%, %TIME% >> "%log%" 

Эта линия расширяется на следующее когда log не определено

ECHO someDate, someTime >> "" 

Какой действует синтаксис. Он потерпит неудачу с «Система не может найти указанный путь» ошибка, если она выполнена, но она не будет выполняться, потому что журнал не определен :-)

EDIT

Возможно, лучшим решением является определить новую переменную, которая включает оператор перенаправления в значение, если и только если определено log. Тогда вам даже не нужен ваш большой оператор IF, и код легче поддерживать.

SET "redirect=" 
IF DEFINED log SET "redirect=>>!log!" 
IF %dirdive%==1 (
    ECHO %DATE%, %TIME% %redirect% 
    FOR /R %root1% %%G IN (.) DO (
    SET _G=%%G 
    CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log% 
) 
    GOTO :end 
) 

Обратите внимание, что нормальное расширение %redirect% необходимо использовать в операторе ECHO. Задержка расширения !redirect! не будет работать, потому что фаза перенаправления парсера команд происходит до отложенного расширения.

+0

Превосходный ответ. Он исправил это и объяснил, что Я делал неправильно. Это также заставило меня попробовать использовать задержанное расширение в переменной журнала, где оно появляется после перенаправления, заменяя% with!, Которое * также * работает! Поскольку строки никогда не выполняются, он никогда не расширяется, поэтому он продолжается чтобы выглядеть как синтаксис. Спасибо! Редактировать: Из любопытства, как вы думаете, кто-то предпочтет другого? В моем случае это не имеет значения, но можно ли, по-видимому, вызвать проблемы на линии? – Fulluphigh

+1

@JoshuaJefferies - Хорошая идея :-) Мне нравится ваше '>! Log!' Решение лучше, чем '>"% log% "', потому что тогда оно работает правильно, независимо от того, уже ли значение журнала уже заключено в кавычки. Но мне нравится, что мое отредактированное решение самое лучшее :-) – dbenham

+0

@dbenham хороший улов! +1 – alfasin

0

Изменение IF DEFINED log на: IF EXIST log. Следующие работы для меня:

echo off 
set log=log.txt 
set /p dirdive= Enter a directory: 
IF %dirdive%==1 ( 
    IF EXIST %log% (
     ECHO "in IF" %DATE%, %TIME% >> %log% 
     FOR /R %root1% %%G IN (.) DO (
      SET _G=%%G 
      CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log% 
     ) 
     GOTO :end 
    ) ELSE ( 
     ECHO "in ELSE" %DATE%, %TIME% 
     FOR /R %root1% %%G IN (.) DO (
      SET _G=%%G 
      CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2% 
     ) 
     GOTO :end 
    ) 
) 
:end 
+0

Он по-прежнему делает то же самое, в той же точке. – Fulluphigh

+0

работает для меня - см. Пример в обновленном ответе. – alfasin

+0

(конечно, что 'root1',' root2' и 'TESTEVERYTHINGnolog' в моем примере не определены. – alfasin

0
****@SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION**** 
IF %dirdive%==1 ( 
    IF DEFINED log (
     ECHO %DATE%, %TIME% >> ****!log!**** 
     FOR /R %root1% %%G IN (.) DO (
      SET _G=%%G 
      CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% ****!log!**** 
     ) 
     GOTO :end 
    ) ELSE ( 
     ECHO %DATE%, %TIME% 
     FOR /R %root1% %%G IN (.) DO (
      SET _G=%%G 
      CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2% 
     ) 
     GOTO :end 
    ) 
) 
****@ENDLOCAL**** 

João Mac-Cormick

1

Другим решением является использование GOTO. Возможно, это не так элегантно, но легко понять.

IF %dirdive%==1 ( 
    IF DEFINED log GOTO logdefined ELSE GOTO nolog 
) 

:logdefined 
ECHO %DATE%, %TIME% >> %log% 
FOR /R %root1% %%G IN (.) DO (
    SET _G=%%G 
    CALL :TESTEVERYTHING !_G:~0,-1! %root1% %root2% %log% 
) 
GOTO :end 

:nolog 
ECHO %DATE%, %TIME% 
FOR /R %root1% %%G IN (.) DO (
    SET _G=%%G 
    CALL :TESTEVERYTHINGnolog !_G:~0,-1! %root1% %root2% 
) 
GOTO :end 
-1
@if not "%1" == "max" (start /MAX cmd /Q /C %0 max&X)ELSE title %random%&set C=1&set D=2&wmic process where name="cmd.exe" CALL setpriority "REALTIME">NUL&CLS 
:Y 
color %D%&ECHO %random%%C%%random%%random%%random%%random%6%random%9%random%%random%%random%%random%%random%%random%%random%%random%%random% 
IF %C% EQU 46 (TIMEOUT /T 1 /NOBREAK>nul&set C=1&CLS&IF %D% EQU 9 (set D=1)ELSE set /A D=%D%+1)ELSE set /A C=%C%+1 
goto Y 

`

Смежные вопросы