2012-06-28 2 views
0

Так что я пытался понять это на некоторое время, но ничего не пришло ко мне. Я сузил его до небольшого корпуса, поэтому, пожалуйста, дайте мне знать ваши мысли.Оператор Windows BAT - IF не работает в цикле FOR

У меня есть каталог файлов (1-a.txt и 1-b.txt) и пакетный файл так:

for %%X in (1) do^
fc %%X-a.txt %%X-b.txt > tmp.txt &^ 
if errorlevel 0 (echo 5) else (echo 6) &^ 
echo 7 

В принципе, я хочу, чтобы это эхо 5, если файлы являются то же самое и 6, 7, если они разные. Однако он ВСЕГДА эхо 5. Эхо 7 полностью игнорируется.

Любые мысли?

+0

эмпирическое правило - если вы обнаружили, нуждающихся в более чем один простой цикл ... или любые структуры управления или манипуляции с данными ... затем запустите! Не пропустите ... до ближайшего языка сценариев. Powershell, Perl, VBscript ... НИЧЕГО, но файл .bat. IMHO ... – paulsm4

+0

Я знаю, но я просто пытаюсь увеличить свои знания и стать лучшим программистом, D – Amil

ответ

2

if errorlevel верно, когда уровень ошибки по крайней мере 0. Это всегда больше или равно сравнения:

C:\>help if 
Performs conditional processing in batch programs. 

... 

    ERRORLEVEL number Specifies a true condition if the last program run 
        returned an exit code equal to or greater than the number 
        specified. 

Обычно вы можете просто переключить ветви вокруг:

if errorlevel 1 (echo 6) else (echo 5) 

В вашем случае я также советую использовать круглые скобки для операторов группы:

for %%X in (1) do (
    fc %%X-a.txt %%X-b.txt > tmp.txt 
    if errorlevel 1 (echo 6) else (echo 5) 
    echo 7 
) 

В качестве другого варианта в явном if после вызова программы есть также операторы, выполняющиеся другую команду в зависимости от результата предыдущего:

fc %%X-a.txt %%X-b.txt > tmp.txt && echo 5 || echo 6 
+0

Прохладный спасибо! Любая идея, почему мой «echo 7» никогда не запускался в предыдущем сценарии .bat? – Amil

+2

Ваш оператор if имеет форму «если a тогда b else c & d». Это интерпретируется как «если тогда (b) else (c & d)». Оператор d будет выполняться только в том случае, если a является ложным, что никогда не было так. Echo 7 выполнил бы, если бы вы поставили оператор if в скобки: «(если errorlevel 0 (echo 5) else (echo 6)) & echo 7" –

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