批处理文件条件语句无法正常工作

时间:2014-09-17 05:42:12

标签: batch-file if-statement

所以我试图创建一个简单的脚本来检查应用程序是否正在使用外部文本文件运行(如果正在运行则使用1和0)或不运行。但是,我似乎无法使声明正常工作..

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之前,我只是使用==来检查是否存在等效性。

非常感谢您给予的任何帮助!

1 个答案:

答案 0 :(得分:2)

1 - 缺少空格

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

2 - 在批处理文件中,除非一个命令改变了这种行为,否则代码行将一个接一个地执行。您可以使用for进行迭代,使用goto进行跳转,使用call调用子例程,使用exit保留批处理,子例程或控制台,但是标签将是不打破执行。在您的if %Running% EQU 1 ...之后没有任何阻止执行继续进入代码后面的代码之后,if测试都没有发现巧合。因此,如果set /p未检索01: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测试,更容易不读取文件,只测试文件的存在。如果文件存在,程序正在运行,否则它没有运行。