Mon objectif avec ce fichier batch est de trouver rapidement le nombre d'applications antivirus installées par un utilisateur. Je prévois de le faire en utilisant deux pour les boucles:DOS imbriqué pour les problèmes de boucle
- boucle extérieure: itérer les noms de dossiers dans le répertoire Program Files
- boucle intérieure: itérer une liste de noms antivirus communs (la variable AVList), recherche de correspondances avec le nom du répertoire actuel et ajout de chaque correspondance à la variable AntiVirus. Cela dit, voici mon code défaillant.
L'erreur que j'obtiens est "" était inattendu pour le moment.. Notez que j'ai actuellement des noms de dossiers dans mes fichiers de programme dans la variable AVList (à des fins de test).
::@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
Voici la sortie redirigés vers un fichier journal:
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)""
Où vais-je tort?
MISE À JOUR: J'ai finalement trouvé le temps de résoudre ce problème. Voici le code mis à jour:
::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
Je sais que cela est d'environ un mois trop tard, mais je voulais faire un suivi. Merci pour l'aide, et j'ai posté le code final dans le message original! – KongMD