为什么 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
....
....
所以我已经在这个批处理脚本上工作了一段时间,这是我写的第一个。这个想法是连接到我们域中的远程机器并收集一些信息。
我正在使用一个 .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
....
....