所以我试图创建一个简单的脚本来检查应用程序是否正在使用外部文本文件运行(如果正在运行则使用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之前,我只是使用==来检查是否存在等效性。
非常感谢您给予的任何帮助!
答案 0 :(得分: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
测试,更容易不读取文件,只测试文件的存在。如果文件存在,程序正在运行,否则它没有运行。