Batch file 对于带有FOR变量(即%p)的循环,IF在批处理/CMD中不起作用

Batch file 对于带有FOR变量(即%p)的循环,IF在批处理/CMD中不起作用,batch-file,if-statement,for-loop,Batch File,If Statement,For Loop,以下命令在Windows Vista及更早版本上无法正确运行。它在Windows7及更高版本上运行良好 批处理示例(名为whateveryouwanttocallit.cmd或somescript.bat(在这种情况下扩展并不重要): 上面的脚本试图只显示非空行 在Windows 7计算机上,生成以下(正确)输出: Pinging 127.0.0.1 with 32 bytes of data: Reply from 127.0.0.1: bytes=32 time<1ms TTL=12

以下命令在Windows Vista及更早版本上无法正确运行。它在Windows7及更高版本上运行良好

批处理示例(名为
whateveryouwanttocallit.cmd
somescript.bat
(在这种情况下扩展并不重要):

上面的脚本试图只显示非空行

在Windows 7计算机上,生成以下(正确)输出:

Pinging 127.0.0.1 with 32 bytes of data: 
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 
Ping statistics for 127.0.0.1: 
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
Minimum = 0ms, Maximum = 0ms, Average = 0ms 
ping 127.0.0.1和32字节的数据:
127.0.0.1的回复:字节=32次在XP上测试

输出端中的所有行,通常不使用0x0D 0x0A(CR-LF),而是使用0x0D 0x0D 0x0A

每行末尾都有一个传统的回车。这不会干扰代码中包含数据的行,但会在“空”行中生成错误

for
命令处理输入时,如果变量/可替换参数均未获得数据,则忽略该行,并且不执行
do
部分中的代码。但是在这个场景中,没有明显内容的行有内容,一个0x0D字符被读取并分配到
%p
。因此该行不会被忽略,执行
do
部分,当变量保存内容且
echo
命令尝试输出回车时,
if
在条件下返回false。但实际上,
echo
命令解释该行没有内容,
echo on/off
输出到控制台

要避免控制台的
echo开/关
输出,请使用
echo(%p

为避免处理“空”行,请过滤ping命令输出

for /f "tokens=*" %p in ('ping -n 1 127.0.0.1 ^| findstr /r "[a-z]"') do ....
在XP上测试

输出端中的所有行,通常不使用0x0D 0x0A(CR-LF),而是使用0x0D 0x0D 0x0A

在每一行的末尾都有一个传统的回车符。这不会干扰数据行中的代码,但会在“空”行中生成错误

for
命令处理输入时,如果变量/可替换参数均未获取数据,则忽略该行,并且不执行
do
部分中的代码。但在这种情况下,没有明显内容的行具有内容,即读取并分配给
%p
的0x0D字符。因此,不会忽略该行,执行
do
部分,当变量包含内容时,
if
在条件上返回false,并且
echo
命令尝试输出回车符。但按原样,
echo
命令解释行没有内容,并且
echo on/off
输出到控制台

要避免控制台的
echo开/关
输出,请使用
echo(%p

为避免处理“空”行,请过滤ping命令输出

for /f "tokens=*" %p in ('ping -n 1 127.0.0.1 ^| findstr /r "[a-z]"') do ....
在XP上测试

输出端中的所有行,通常不使用0x0D 0x0A(CR-LF),而是使用0x0D 0x0D 0x0A

在每一行的末尾都有一个传统的回车符。这不会干扰数据行中的代码,但会在“空”行中生成错误

for
命令处理输入时,如果变量/可替换参数均未获取数据,则忽略该行,并且不执行
do
部分中的代码。但在这种情况下,没有明显内容的行具有内容,即读取并分配给
%p
的0x0D字符。因此,不会忽略该行,执行
do
部分,当变量包含内容时,
if
在条件上返回false,并且
echo
命令尝试输出回车符。但按原样,
echo
命令解释行没有内容,并且
echo on/off
输出到控制台

要避免控制台的
echo开/关
输出,请使用
echo(%p

为避免处理“空”行,请过滤ping命令输出

for /f "tokens=*" %p in ('ping -n 1 127.0.0.1 ^| findstr /r "[a-z]"') do ....
在XP上测试

输出端中的所有行,通常不使用0x0D 0x0A(CR-LF),而是使用0x0D 0x0D 0x0A

在每一行的末尾都有一个传统的回车符。这不会干扰数据行中的代码,但会在“空”行中生成错误

for
命令处理输入时,如果变量/可替换参数均未获取数据,则忽略该行,并且不执行
do
部分中的代码。但在这种情况下,没有明显内容的行具有内容,即读取并分配给
%p
的0x0D字符。因此,不会忽略该行,执行
do
部分,当变量包含内容时,
if
在条件上返回false,并且
echo
命令尝试输出回车符。但按原样,
echo
命令解释行没有内容,并且
echo on/off
输出到控制台

要避免控制台的
echo开/关
输出,请使用
echo(%p

为避免处理“空”行,请过滤ping命令输出

for /f "tokens=*" %p in ('ping -n 1 127.0.0.1 ^| findstr /r "[a-z]"') do ....

FOR/F将从每行(如果存在)中删除一个尾随0x0D字符。因此,另一个选项是添加额外的FOR/F循环:

for /f "delims=" %%A in ('ping -n 1 127.0.0.1') do for /f "delims=" %%B in ("%%A") do echo %%B

FOR/F将从每行(如果存在)中删除一个尾随0x0D字符。因此,另一个选项是添加额外的FOR/F循环:

for /f "delims=" %%A in ('ping -n 1 127.0.0.1') do for /f "delims=" %%B in ("%%A") do echo %%B

FOR/F将从每行(如果存在)中删除一个尾随0x0D字符。因此,另一个选项是添加额外的FOR/F循环:

for /f "delims=" %%A in ('ping -n 1 127.0.0.1') do for /f "delims=" %%B in ("%%A") do echo %%B

FOR/F将从每行(如果存在)中删除一个尾随0x0D字符。因此,另一个选项是添加额外的FOR/F循环:

for /f "delims=" %%A in ('ping -n 1 127.0.0.1') do for /f "delims=" %%B in ("%%A") do echo %%B

当访问批处理文件中的令牌时,您需要双重
%%
。->使用
%%p
您还应该使用
“delims=“
来解析整行内容。@npocmaka我的错误,我应该澄清一下。这个问题在cmd和批处理中都存在scripts@foxidrive这或
“tokens=*”
。两者都不会对