Моя цель с помощью этого пакетного файла - быстро узнать, сколько антивирусных приложений установлено пользователем. Я планирую сделать это, используя два цикла for:
- Внешний цикл: перебирать имена папок в каталоге Program Files
- Внутренний цикл: перебирайте список распространенных имен антивируса (переменная AVList), ищите совпадения с текущим именем каталога и добавляйте каждое совпадение к переменной AntiVirus.
С учетом сказанного, вот мой ошибочный код. Ошибка, которую я получаю, "", была неожиданной в это время. . Обратите внимание, что в настоящее время у меня есть имена папок в моих программных файлах в переменной AVList (для целей тестирования).
::@echo off
::variables
set AntiVirus="Initial Value"
set AVList=(adobe ccleaner auslogics)
SETLOCAL EnableDelayedExpansion
echo Checking Program Files...
if "%Processor_Architecture%" == "AMD64" (
echo 64-bit OS
echo.
for /d %%f in ("%ProgramFiles(x86)%\*") do (
echo "%%f"
SET "folder=%%f"
REM Begin loop to search substrings with words in AVList
Call:SearchAV "%folder%"
)
)
else echo 32-bit OS
echo.
echo AntiVirus: %AntiVirus%
echo.
for /d %%g in ("%ProgramFiles%\*") do (
echo "%%g"
SET "folder=%%g"
REM Begin loop to search substrings with words in AVList
Call:SearchAV "%folder%"
)
)
:SearchAV
for %%v in ("%AVList%") do (
echo "%%v"
SET "av=%%v"
if /I NOT "!~1:av=!"=="!~1!" set AntiVirus="%AntiVirus%%av%"
)
GOTO:EOF
echo.
echo.
echo %AntiVirus% found
echo.
echo Script created by Matthew Ammann, revised by Andriy M from StackOverflow
@pause
Вот вывод, перенаправленный в файл журнала:
C:\AVFinder>set AntiVirus="Initial Value"
C:\AVFinder>set AVList=(adobe ccleaner auslogics)
C:\AVFinder>SETLOCAL EnableDelayedExpansion
C:\AVFinder>echo Checking Program Files...
Checking Program Files...
C:\AVFinder>if "AMD64" == "AMD64" (
echo 64-bit OS
echo.
for / %f in ("C:\Program Files (x86)\*") do (
echo "%f"
SET "folder=%f"
REM Begin loop to search substrings with words in AVList
Call:SearchAV "C:\Program Files (x86)\Adobe"
)
)
64-bit OS
C:\AVFinder>(
echo "C:\Program Files (x86)\Adobe"
SET "folder=C:\Program Files (x86)\Adobe"
REM Begin loop to search substrings with words in AVList
Call:SearchAV "C:\Program Files (x86)\Adobe"
)
"C:\Program Files (x86)\Adobe"
"" was unexpected at this time.
C:\AVFinder> if /I NOT "!~1:av=!"=="!~1!" set AntiVirus=""Initial Value""(adobe ccleaner auslogics)""
Где я иду не так?
ОБНОВЛЕНИЕ: Я наконец нашел время, чтобы это исправить. Вот обновленный код:
::This script is licensed under the Creative Commons Attribution license (CC BY 3.0)
::Simply mention the original author in the source code if you make a derivative work.
@echo off
::variables
set AntiVirus=
set AVList=(norton mcafee kaspersky symantec avg comodo avast avira webroot eTRUST)
SETLOCAL EnableDelayedExpansion
echo Checking Program Files...
if "%Processor_Architecture%" == "AMD64" (
echo 64-bit OS
echo.
for /d %%f in ("%ProgramFiles(x86)%\*") do (
echo "%%f"
SET "path=%%f"
Call:SearchAV "!path!"
)
) else echo 32-bit OS
for /d %%g in ("%ProgramFiles%\*") do (
echo "%%g"
SET "path=%%g"
Call:SearchAV "!path!"
)
)
goto :END
:SearchAV
FOR %%a in %AVLIST% do (
set res="%~n1"
set res=!res:%%a=!
if NOT "%~n1" ==!res! (
ECHO "%~n1" contains %%a
if [!AntiVirus!] == [] (
set AntiVirus="%~n1"
) else (
set AntiVirus=!AntiVirus!, "%~n1"
)
)
)
goto :eof
:END
echo.
echo.
echo !AntiVirus! found
echo.
echo Script created by Matthew Ammann, revised by members of Stack Overflow
echo
@pause