File 批处理文件第三个“;若否,";未到达语句

File 批处理文件第三个“;若否,";未到达语句,file,batch-file,if-statement,File,Batch File,If Statement,大家好,我的社区 我正在编写一个批处理文件来进行一些自动计算机维护,并包含了几个防病毒应用程序。由于某种原因,第三个“如果不是”语句从未到达 :AV REM MSE if not '%MSE%'=='' ( Echo Scanning for viruses using Microsoft Security Essentials. Echo. %MSE% -Scan -ScanType 1 Echo. GOTO Defrag ) REM AVG if not '%AVG%'=='' ( Ech

大家好,我的社区

我正在编写一个批处理文件来进行一些自动计算机维护,并包含了几个防病毒应用程序。由于某种原因,第三个“如果不是”语句从未到达

:AV
REM MSE
if not '%MSE%'=='' (
Echo Scanning for viruses using Microsoft Security Essentials.
Echo.
%MSE% -Scan -ScanType 1
Echo.
GOTO Defrag
)

REM AVG
if not '%AVG%'=='' (
Echo Scanning for viruses using AVG.
Echo.
%AVG% /COMP /QT /TRASH
Echo.
GOTO Defrag
)

REM NOD32
if not '%NOD32%'==''(
Echo Scanning for viruses using NOD32.
Echo.
if '%NOD32%'=='' GOTO NOD32NotFound
%NOD32% /aind /auto /log-file="%userprofile%\Desktop\Scan_Results.txt"
Echo.
GOTO Defrag
)

REM If all else fails...
GOTO AVNotFound
目前,有三个代码块,每个防病毒程序一个。仅当变量%AVG%%MSE%或%NOD32%不为空时,才会执行每个代码块,这意味着它们指向有效文件。我使用以下代码分配变量:

if exist "%programfiles(x86)%\AVG\AVG2012\avgscana.exe" set AVG="%programfiles(x86)%\AVG\AVG2012\avgscana.exe"
这三个代码块都工作得很好,编码没有问题。问题是无论第三个块是什么,它都不会执行。因此,在当前示例中,代码块的顺序是MSE、AVG和NOD32。NOD32的代码块不执行,因为它是第三个代码块。相反,如果我将这些块剪切并粘贴到另一个顺序中,并且AVG的代码块是第三个块,它将不会执行

有什么想法吗

有什么建议吗


编辑以澄清。

变量是
%MSE%
%AVG%
还是
%NOD32%
批处理文件?如果是,则需要使用“call”来调用它们(例如
call%AVG%


如果从另一个批处理文件调用批处理文件,第一个批处理文件将在执行第二个批处理文件后退出,除非使用“call”调用该批处理文件。您的
%AVG%
%NOD32%
%MSE%
变量中是否有括号?它们可能在
C:\ProgramFiles(x86)\
路径中吗?支架将过早关闭分支

在命令的可执行部分周围加引号,例如:

"%MSE%" -Scan -ScanType 1

行中缺少一个空格:

if not '%NOD32%'==''(
尝试:


当我尝试脚本时,这一行导致了失败。更改行后,它工作了。

如果从第一个批处理文件调用第二个批处理文件时没有
CALL
(或
CMD/C
)命令,则净结果相当于“转到另一个文件”(如果可能的话)。我调用了一个以这种方式调用的批处理文件(而不是子例程)。变量不是批处理文件。它们指的是:如果存在“%programfiles%\Microsoft Security Client\Antimalware\MPCMDRUN.EXE”set MSE=“%programfiles%\Microsoft Security Client\Antimalware\MPCMDRUN.EXE”脚本工作正常,只是第三个块没有执行。因此,如果代码块来自MSE、AVG、NOD32,那么NOD32的代码块将不会执行,因为它是第三个块。相反,如果我将块剪切并粘贴成不同的顺序,使AVG成为最后一个块,AVG的代码块将不会执行。如果从另一个*.bat文件调用*.bat文件,调用方将在第二个(内部)完成后退出。这节省了我的时间:调用必须用“call inner.bat”而不是“inner.bat”完成。变量中可以有括号,但我将变量编码为字符串,括号中已经包含:如果存在“%programfiles(x86)%\AVG\AVG2012\avgscana.exe”set AVG=“%programfiles(x86)%\AVG\AVG2012\avgscana.exe”单个代码块工作得很好,只是第三个代码块从未执行过。因此,如果代码块来自MSE、AVG、NOD32,那么NOD32的代码块将不会执行,因为它是第三个块。相反,如果我将这些块剪切并粘贴成不同的顺序,使AVG成为最后一个块,AVG的代码块将不会执行。
if not '%NOD32%'=='' (