Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 用于在目录名中搜索字符串的批处理文件_Loops_Batch File - Fatal编程技术网

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

Loops 用于在目录名中搜索字符串的批处理文件,loops,batch-file,Loops,Batch File,我的批处理文件在分配第一个环境变量(下面的脚本输出)后提前终止。我试着打开echo,使用errorlevels,将输出发送到文本文件,并检查语法。我花了几个小时研究调试批处理脚本,但我终于遇到了麻烦 脚本的目标是:搜索用户程序文件的每个目录名,查找常见的防病毒程序。我意识到,为了达到这个目的,迭代一组防病毒名称是最容易的,但我现在想保持简单 @echo off ::variables set AntiVirus1="Initial Value" IF NOT ERRORLEVEL 0 echo

我的批处理文件在分配第一个环境变量(下面的脚本输出)后提前终止。我试着打开echo,使用errorlevels,将输出发送到文本文件,并检查语法。我花了几个小时研究调试批处理脚本,但我终于遇到了麻烦

脚本的目标是:搜索用户程序文件的每个目录名,查找常见的防病毒程序。我意识到,为了达到这个目的,迭代一组防病毒名称是最容易的,但我现在想保持简单

@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

首先,
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."
或者像这样:

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 /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
:@echo关闭
::变量
set US1=“初始值”
如果不是ERRORLEVEL 0(回显%ERRORLEVEL%),则回显“已成功创建环境变量”
SETLOCAL EnableDelayedExpansion
回音检查程序文件。。。
对于(“%ProgramFiles%\*”)中的/d%%f,请执行以下操作(
回显“%%f”
设置“文件夹=%%f”
如果/I不是“!folder:adobe=!”=“!folder!”set AntiVirus1=“adobe”
)
找到echo%1%
@停顿
这里有一些解释

语法是一种延迟扩展,相当于
%
,仅用于环境变量,不用于循环变量,也不用于命令行参数。需要延迟扩展,因为我们处于一个带括号的块中。带括号的块在开始执行之前会被完全解析,因此所有
%var%
表达式都会在块开始之前展开(计算),并且在块的整个执行过程中不会更改。这不适合我们,因为我们需要在块执行期间为变量分配不同的值,并且必须在块内读取这些值。延迟扩展,如名称所示,延迟变量的扩展,直到引用该变量的每个命令实际执行为止。由于即时扩展仍然可以与延迟扩展一起使用,因此引入了不同的语法,即
围绕变量名,而不是
%

!文件夹:adobe=表示评估
文件夹
并用空字符串替换每次出现的
adobe
。然后将此表达式的结果与
文件夹的(未更改)值进行比较。如果存在匹配项,则不会发生替换,这意味着
文件夹
的值中首先没有
adobe
。在这种情况下,我们什么也不做。但是如果没有匹配,即如果修改的值与未修改的值不匹配,那么我们应该设置
AntiVirus1
变量。这就是为什么在比较前面有
而不是


/I
选项仅表示不区分大小写的比较。

感谢您向我展示了糟糕的语法。我已经清理了它,但是当脚本结束时,我的AntiVirus1变量始终是“初始值”。有什么我需要更改的条件语句吗?我使用的是“adobe”而不是“mcafee”,因为这是一个我可以测试的文件夹。我的新代码在原来的帖子里。所以,如果我理解正确的话,
!文件夹:adobe=
语句查找单词adobe的任何实例,并将其替换到局部变量
文件夹中
?%如果文件夹名称中的子字符串与
文件夹
变量中的任何内容匹配,则将更改AntiVirus1%。我有几个关于语法的小问题。我以为冒号是一个创造标签的符号?另外,DOS如何知道
末尾的等号!文件夹:adobe=不是该字符串的一部分?@KongMD:是的,表达式会搜索子字符串并替换它,但变量不受影响。表达式遵循此模板:
%var:string1=string2%
<代码>%
=
都是语法的一部分<代码>%
s被替换为
s,因为我们需要使用延迟扩展<代码>:
将变量名与后面要查找的子字符串部分分开
=
将子字符串与下面的部分分开,下面的部分是用来替换我们正在寻找的子字符串的字符串,在我们的特殊情况下,它是一个空字符串(在
=
和结束语
之间没有任何内容)。因此效果是,所有出现的
adobe
都会被删除(如果找到的话)。通过在命令提示下发出
help set
set/?
,您可以找到有关该主题的更多详细信息。但是你可以问是否有什么是