为什么 FOR /F 在从文件中获取数据时选择 space 作为有效行,我该如何防止这种情况发生?

Why does FOR /F pick up a space as a valid line when getting data from a file and how do I prevent this?

所以我已经在这个批处理脚本上工作了一段时间,这是我写的第一个。这个想法是连接到我们域中的远程机器并收集一些信息。

我正在使用一个 .txt 文件,其中包含机器的 IP 地址,每行一个,每个都用逗号分隔。

192.168.1.1,

192.168.1.2,

192.168.1.3

出于某种原因,一旦脚本到达文件中的最后一个 IP 地址,它就会查询空白 space。这个空白 space 是尾随的 space 字符吗?我该如何防止这种情况发生?

我目前设置脚本的方式意味着当无法访问计算机时,它会向日志文件回显一条消息。因此,每次我 运行 脚本时,它都会添加一个额外的行,上面写着“(BLANK SPACE) Machine was Unreachable” 我知道这只是一件小事,但是烦死我了。

这是我的代码

@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

这是我试图阻止 FOR /F 查询空白的方法 space。

for /F "tokens=* delims=," %%i in (C:\testlist.txt) DO call :test %%i

这不会抛出任何错误消息,但它仍然查询空白 space。

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

这会抛出错误消息“系统找不到文件|.”并且仍然查询空白space.

此外,如果有任何关于如何改进我的代码的提示,我们将不胜感激。

您对space没有问题。

在批处理文件中,当您使用子程序时,您声明一个标签作为起点,但是没有什么可以阻止批处理文件执行到标签之后的代码。

一旦你的for命令结束了对文件的处理,bat继续执行并执行标签之后的代码,但是这次%1是空的(好吧,或者不是,现在%1 引用批处理文件的第一个参数),因此 ping 不带参数执行,显示它的帮助并且因为它不包含 Reply 字符串(我无法测试,我有西班牙语语言环境),它被视为无法访问的机器。

:test标签之前放置一个goto :eof以避免执行输入此代码除非被调用。

@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
....
....