2014-09-17 2 views
1

Итак, я пытаюсь создать простой скрипт, чтобы проверить, работает ли приложение с использованием внешнего текстового файла (с использованием 1 и 0 для if или if). Однако я не могу показаться, чтобы получить заявление работает правильно ..Ошибка условного оператора пакетного файла

setlocal enabledelayedexpansion 

set /p Running=<IsRunning.txt 
IF %Running% EQU 0(GOTO ProgramNotRunning) 
IF %Running% EQU 1(GOTO ProgramRunning) 


:ProgramNotRunning 
echo program starting 
echo 0 >IsRunning.txt 
echo 1 >IsRunning.txt 
GOTO:EOF 

:ProgramRunning 
echo program already running 
GOTO:EOF 

проблема не будет, независимо от того, какое значение оно, оно всегда только когда работает блок ProgramNotRunning кода, а не другой.

Прежде чем использовать EQU, я просто использовал == для проверки equivilance.

Большое спасибо за предоставленную помощь!

ответ

2

1 - Недостающие пространства

If %Running% EQU 0 (... 
       ^This space is needed 

2 - в пакетных файлах строк кода выполняются один за другим, если только одна команда изменения этого поведения. Вы можете выполнить итерацию с for, прыгать с goto, вызвать подпрограммы с call, оставить пакет, подпрограмму или консоль с exit, ... но ярлык не нарушит выполнение. После вашего if %Running% EQU 1 ... нет ничего, что помешало бы исполнению продолжить код в следующем коде, ни один из тестов if не нашел совпадения. Итак, если set /p не извлекает 0 или 1, код после :ProgramNotRunning будет всегда выполнен.

3 - Отсутствует/пустой файл. Если IsRunning.txt не может быть найден или пуст (или, по крайней мере, первая строка пуста), или если он содержит неожиданное значение, строки if потерпят неудачу. Выполненный код:

file missing : if EQU 0 (
line/file empty : if EQU 0 (
bad data  : if this is a test EQU 0 (

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

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    rem Retrieve running state 
    set "Running=" 
    if exist "IsRunning.txt" ( 
     set /p "Running=" < "IsRunning.txt" 
    ) 

    IF "%Running%" EQU "0" goto ProgramNotRunning 
    IF "%Running%" EQU "1" goto ProgramRunning 

    rem As there is no valid data, assume the program is not running 

:ProgramNotRunning 
    echo program starting 
    >"IsRunning.txt" (echo 1) 
    goto :eof 

:ProgramRunning 
    echo program already running 
    goto :eof 

Почему >"IsRunning.txt" (echo 1)? Просто чтобы убедиться, что нет Доп пространства после 1, которые будут включены в выходной (как это происходит с вашим кодом), извлекаемые когда линия прочитанные из файла и вызывающими if на провал

if "1 " EQU "1" (... This will be evaluated to false 

И это все еще оставляет случаи, когда извлеченные данные могут привести к сбою кода. Для теста 0/1 легче не читать файл, просто проверить наличие файла. Если файл существует, программа запущена, иначе он не будет запущен.

+0

спасибо за очень описательный ответ, я не знал, что сценарий .bat был чувствительным к белому пространству;) и была именно такой проблемой! Также! очень хорошая точка в отношении пробелов позади текста. Раньше я этого не замечал. +1 – Raider00321

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