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
легче не читать файл, просто проверить наличие файла. Если файл существует, программа запущена, иначе он не будет запущен.
спасибо за очень описательный ответ, я не знал, что сценарий .bat был чувствительным к белому пространству;) и была именно такой проблемой! Также! очень хорошая точка в отношении пробелов позади текста. Раньше я этого не замечал. +1 – Raider00321