Windows 从文件中获取数据时,为什么FOR/F会选择一个空格作为有效行?如何防止这种情况?

Windows 从文件中获取数据时,为什么FOR/F会选择一个空格作为有效行?如何防止这种情况?,windows,batch-file,for-loop,cmd,psexec,Windows,Batch File,For Loop,Cmd,Psexec,所以我已经在这个批处理脚本上工作了一段时间,这是我写的第一个。这个想法是连接到我们领域中的远程机器并收集一些信息 我使用的是一个.txt文件,其中包含机器的IP地址,每行一个,每个都用逗号分隔,就像这样 192.168.1.1 192.168.1.2 192.168.1.3 出于某种原因,一旦脚本到达文件中的最后一个IP地址,它就会查询一个空白。这个空格是尾随空格字符吗?我如何防止这种情况发生 我当前获取脚本设置的方式意味着,当无法访问计算机时,它会向日志文件回显消息。所以每次我运行脚本时,它都

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

我使用的是一个.txt文件,其中包含机器的IP地址,每行一个,每个都用逗号分隔,就像这样

192.168.1.1

192.168.1.2

192.168.1.3

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

我当前获取脚本设置的方式意味着,当无法访问计算机时,它会向日志文件回显消息。所以每次我运行脚本时,它都会添加一行额外的内容,说“(空白)机器无法访问“我知道这只是一件小事,但它困扰着我。”

这是我的密码

@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查询空白的内容

for /F "tokens=* delims=," %%i in (C:\testlist.txt) DO call :test %%i
for /F %%i in (C:\testlist.txt ^| findstr /C:" "  /v /r "^$" ) DO call :test %%i
这不会抛出任何错误消息,但仍会查询空白

for /F "tokens=* delims=," %%i in (C:\testlist.txt) DO call :test %%i
for /F %%i in (C:\testlist.txt ^| findstr /C:" "  /v /r "^$" ) DO call :test %%i
抛出错误信息“系统找不到文件”,并且还查询空白空间。

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

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

您对空间没有问题

在批处理文件中,当您使用子例程时,您会声明一个标签作为起点,但是没有任何东西可以阻止批处理文件执行到达标签后面的代码

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

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

@echo关闭
标题审核脚本
对于(C:\testlist.txt)中的/F%%i,请调用:test%%i

goto:eof你没有空间问题

在批处理文件中,当您使用子例程时,您会声明一个标签作为起点,但是没有任何东西可以阻止批处理文件执行到达标签后面的代码

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

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

@echo关闭
标题审核脚本
对于(C:\testlist.txt)中的/F%%i,请调用:test%%i

转到:默认情况下,
FOR/F
跳过空行。你确定那行没有其他类型的控制字符吗?我不知道。除了上面提到的字符外,没有其他字符。默认情况下,
FOR/F
跳过空行。你确定那行没有其他类型的控制字符吗?我不知道。除了上面提到的字符外,绝对没有其他字符。哦,这真的很有意义。非常感谢。哦,这真的很有道理。非常感谢。