Loops 用于在目录名中搜索字符串的批处理文件
我的批处理文件在分配第一个环境变量(下面的脚本输出)后提前终止。我试着打开echo,使用errorlevels,将输出发送到文本文件,并检查语法。我花了几个小时研究调试批处理脚本,但我终于遇到了麻烦 脚本的目标是:搜索用户程序文件的每个目录名,查找常见的防病毒程序。我意识到,为了达到这个目的,迭代一组防病毒名称是最容易的,但我现在想保持简单Loops 用于在目录名中搜索字符串的批处理文件,loops,batch-file,Loops,Batch File,我的批处理文件在分配第一个环境变量(下面的脚本输出)后提前终止。我试着打开echo,使用errorlevels,将输出发送到文本文件,并检查语法。我花了几个小时研究调试批处理脚本,但我终于遇到了麻烦 脚本的目标是:搜索用户程序文件的每个目录名,查找常见的防病毒程序。我意识到,为了达到这个目的,迭代一组防病毒名称是最容易的,但我现在想保持简单 @echo off ::variables set AntiVirus1="Initial Value" IF NOT ERRORLEVEL 0 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
首先,
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=如果要搜索的字符串(在本例中为“adobe”)未被空格分隔,则code>不是该字符串的一部分?@KongMD:是的,表达式会搜索子字符串并替换它,但变量不受影响。表达式遵循此模板:%var:string1=string2%
<代码>%
,:
,=
都是语法的一部分<代码>%
s被替换为代码>s,因为我们需要使用延迟扩展<代码>:
将变量名与后面要查找的子字符串部分分开=
将子字符串与下面的部分分开,下面的部分是用来替换我们正在寻找的子字符串的字符串,在我们的特殊情况下,它是一个空字符串(在=
和结束语!
之间没有任何内容)。因此效果是,所有出现的adobe
都会被删除(如果找到的话)。通过在命令提示下发出help set
或set/?
,您可以找到有关该主题的更多详细信息。但是你可以问是否有什么是