我分配第一个环境变量(下面的脚本输出)后,我的批处理文件过早终止。我尝试使用错误级别,将输出发送到文本文件并检查语法来启用echo。我花了几个小时研究调试批处理脚本,但我终于遇到了问题。
脚本目标:搜索用户程序文件的每个目录名称,查找常见的防病毒程序。我意识到为此目的最简单地遍历一系列防病毒名称,但我想暂时保持简单。
@echo off
::variables
set AntiVirus1="Initial Value"
IF NOT ERRORLEVEL 0 echo %ERRORLEVEL%
else echo "env. variable created successfully."
for /d %%f in (""%ProgramFiles%\*"") do (
{
IF NOT ERRORLEVEL 0 echo %ERRORLEVEL%
echo "%%f"
if exist /i "*McAfee*" < %%f %AntiVirus1%="McAfee"
::find "Norton" < %%f
::find "Comodo" < %%f
::find "AVG" < %%f
}
echo %AntiVirus1%
@pause
此脚本的输出:
C:\ Users \ Matt \ Desktop&gt;设置AntiVirus1 =“初始值” C:\用户\马特\桌面和GT;
有人能指出我做错了吗?
更新已更正的脚本,现在正在运行但返回的结果不正确:
::@echo off
::variables
set AntiVirus1="Initial Value"
IF NOT ERRORLEVEL 0 (echo %ERRORLEVEL%) ELSE echo "env. variable created successfully."
echo Checking Program Files...
for /d %%f in ("%ProgramFiles%\*") do (
echo "%%f"
if %%f=="*adobe*" set AntiVirus1="adobe"
)
echo %AntiVirus1% found
@pause
答案 0 :(得分:2)
首先,ELSE
必须与同一行上的IF
或位于同一行,其中右括号与IF
相关。在特定情况下,您应该更改第一个IF...ELSE
命令:
IF NOT ERRORLEVEL 0 (ECHO %ERRORLEVEL%) ELSE ECHO "env. variable created successfully."
或者像这样:
IF NOT ERRORLEVEL 0 (
ECHO %ERRORLEVEL%
) ELSE ECHO "env. variable created successfully."
(大写和缩进是完全可选的。)
其他问题:
FOR
循环标题中的重复引号:
for /d %%f in (""%ProgramFiles%\*"") do (
应该是
for /d %%f in ("%ProgramFiles%\*") do (
围绕循环体的大括号({
,}
)。它们不是循环语法的一部分(事实上,它们根本不是批处理脚本语法的一部分),所以应该删除它。
在DO
之后没有与开头的括号匹配。它应该在循环体之后的单独行中添加。
在循环体中错误地使用::
- 样式注释。它们不允许放在括号内。请改用REM
。
<强>更新强>
在批处理脚本中,对子字符串的测试有些不同寻常。您将需要另一个环境变量,您还需要启用延迟扩展。后者与比较并没有真正联系,但是需要它,因为比较将在括号内执行。
这是您修改的新脚本,其中突出显示了更改:
::@echo off
::variables
set AntiVirus1="Initial Value"
IF NOT ERRORLEVEL 0 (echo %ERRORLEVEL%) ELSE echo "env. variable created successfully."
SETLOCAL EnableDelayedExpansion
echo Checking Program Files...
for /d %%f in ("%ProgramFiles%\*") do (
echo "%%f"
SET "folder=%%f"
if /I NOT "!folder:adobe=!"=="!folder!" set AntiVirus1="adobe"
)
echo %AntiVirus1% found
@pause
以下是一些解释。
!
语法是相当于%
的延迟扩展,仅用于环境变量,不用于循环变量,不用用于命令行参数。需要延迟扩展,因为我们处于括号内。括号内的块在开始执行之前完全被解析,因此所有%var%
表达式在块开始之前被扩展(计算),并且在块的执行过程中不会被更改。这不适合我们,因为我们需要在块执行期间为变量分配不同的值,并且必须在块内读取值。从名称开始,延迟扩展会延迟变量的扩展,直到实际执行引用该变量的每个命令为止。由于即时扩展仍可与延迟扩展一起使用,因此引入了不同的语法,即!
围绕变量名,而不是%
。
!folder:adobe=!
表示使用空字符串评估folder
替换每次出现的adobe
。然后将该表达式的结果与folder
的(未更改的)值进行比较。如果匹配,则不会发生替换,这意味着首先adobe
的值中没有folder
。在这种情况下,我们什么都不做。但是如果不匹配,即如果修改后的值与未修改的值不匹配,那么我们应该设置AntiVirus1
变量。这就是比较前面NOT
的原因。
/I
选项仅表示不区分大小写的比较。