用于在目录名称中搜索字符串的批处理文件

时间:2011-09-15 02:54:12

标签: loops batch-file

我分配第一个环境变量(下面的脚本输出)后,我的批处理文件过早终止。我尝试使用错误级别,将输出发送到文本文件并检查语法来启用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

1 个答案:

答案 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选项仅表示不区分大小写的比较。