2016-12-02 1 views
0

J'ai donc travaillé sur ce script batch pendant un moment maintenant, c'est le premier que j'ai jamais écrit. L'idée est de se connecter à des machines distantes dans notre domaine et de recueillir des informations.Pourquoi FOR/F prend-t-il un espace comme ligne valide lors de l'obtention de données d'un fichier et comment puis-je empêcher cela?

J'utilise un fichier .txt avec les adresses IP des machines, une par ligne et chacune séparée par une virgule comme ça.

192.168.1.1,

192.168.1.2,

192.168.1.3

Pour une raison quelconque, une fois le script atteint la dernière adresse IP dans le fichier, il interroge un espace vide. Cet espace vide est-il un caractère d'espace de fin? et comment puis-je empêcher cela? La façon dont j'ai actuellement la configuration du script signifie que lorsqu'un ordinateur est inaccessible, il renvoie un message au fichier journal. Donc, chaque fois que je lance le script, j'ajoute une ligne supplémentaire disant "(BLANK SPACE) La machine était inaccessible" Je sais que c'est seulement une petite chose mais ça m'embête.

Voici mon code

@echo off 
title Audit Script 

for /F %%i in (C:\testlist.txt) DO call :test %%i 

:test 

ping %1 > out.txt 
find "Reply" out.txt > nul 
if %ERRORLEVEL%==0 GOTO sysinf 
if %ERRORLEVEL%==1 GOTO pingerror 

:pingerror 
echo %1 Unreachable 
echo. >> C:\Computer-Audit.log 
echo ########################################################## >> C:\Computer-Audit.log 
echo MACHINE %1 was unreachable on the %date% at %time% >> C:\Computer-Audit.log 
echo ########################################################## >> C:\Computer-Audit.log 
echo. >> C:\Computer-Audit.log 
GOTO :eof 

:sysinf 
psexec \\%1 -u Administrator -p g2m60gy -accepteula -nobanner -low -n 10  systeminfo | findstr "Host OS" >> C:\Computer-Audit.log 

if %ErrorLevel% EQU 0 GOTO reg 
if errorlevel 1 GOTO test 

:reg 
FOR /F "tokens=2*" %%A IN (
'psexec \\%1 -u Administrator -p g2m60gy -accepteula -nobanner -low -n 10 reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Betting Till_is1" /v DisplayVersion 2^> nul' 
) DO SET DisplayName=%%B 
echo Betting Till Version:  %DisplayName% >> C:\Computer-Audit.log 

Voici ce que j'ai essayé d'empêcher le FOR/F de l'interrogation d'un espace vide. Cela ne renvoie aucun message d'erreur mais il interroge toujours un espace vide.

for /F %%i in (C:\testlist.txt ^| findstr /C:" " /v /r "^$") DO call :test %%i 

Cela jette le message d'erreur « Le système ne peut pas trouver le fichier |. » et aussi interroge encore l'espace vide.

En outre, tous les conseils sur la façon d'améliorer mon code seraient très appréciés.

+0

Par défaut, 'FOR/F' ignore les lignes vides. Vous êtes sûr qu'il n'y a pas d'autre type de caractère de contrôle sur cette ligne? – Squashman

+0

Je ne le savais pas. Il n'y a certainement pas de caractères supplémentaires autres que ceux indiqués ci-dessus. – ThisBritishGuy

Répondre

5

Vous n'avez pas de problème avec un espace. Dans les fichiers batch, lorsque vous utilisez un sous-programme, vous déclarez une étiquette comme point de départ, mais rien n'empêche l'exécution du fichier par lots d'atteindre le code après l'étiquette.

Une fois votre commande for a terminé le traitement du dossier, l'exécution de chauve-souris continue et le code après que l'étiquette est exécuté, mais cette fois %1 est vide (bien ou pas, maintenant %1 fait référence au premier argument du fichier batch), donc ping est exécuté sans arguments, montre son aide et comme il ne contient pas la chaîne Reply (je ne peux pas tester, j'ai un locale espagnol), il est manipulé comme une machine inaccessible.

Placez un goto :eof devant le libellé :test pour éviter l'exécution pour entrer ce code à moins d'être appelé.

@echo off 
title Audit Script 

for /F %%i in (C:\testlist.txt) DO call :test %%i 

goto :eof <- This jumps to the end of the file 

:test 
.... 
.... 
+0

Oh, ça a vraiment un sens. Je vous remercie! – ThisBritishGuy