关于为什么以下type
批处理文件的for /f
循环没有在Windows XP
上显示第二个标记(*)的第一个字符的任何想法(仅限)?
注意:set "test=%%a"
是使用ping
来解决问题,只在其输出中输入<CR>
而不是<CR><LF>
?在jeb
Windows XP
上
答案 0 :(得分:2)
在Windows XP中,ping
命令似乎在行尾之前生成了额外的0x0D
(回车)字符。因此,当%%b
收到一个值时,它会与尾随的CR char一起接收它。当你打印%%b
时,CR自然会使“car”返回到行的开头,因此关闭"
和后续空格字符({{1}之间的那个) }和"
)覆盖已打印的前两个字符,即开头&
和值的第一个字母。
您可以通过将"
的输出重定向到文件,然后在十六进制查看器中查看文件来轻松验证它。我使用Far Manager的内置查看器来确定事实:
这是文件的普通视图,突出显示任意行结尾:
这是十六进制视图模式下的同一个文件,此处也突出显示相同的区域,以显示该行实际结束的字符:
对于非英文内容感到抱歉,还没有得到英文Win XP的便利。希望这个问题在拍摄中仍然是显而易见的。
答案 1 :(得分:1)
有趣。根据没有@echo off
得到的输出,看起来是变量被评估时的差异(作为“外部”shell的一部分或“内部”shell的一部分,我怀疑)。
但是,如果您将参数传递给函数,如下所示,它在XP和Win7中都可以正常工作:
@echo off
goto :main
:xyzzy
if "x%1"=="x""" goto :eof
echo %1
echo %2
echo.
goto :eof
:main
echo.&echo.
ping -n 1 google.com
echo.&echo.
for /f "tokens=1*" %%a in ('ping -n 1 google.com') do call :xyzzy "%%a" "%%b"
echo.&echo.
你会注意到我在xyzzy
函数中也抛弃了空行,因为它们似乎没有添加任何值。如果你真的想要它们输出,只需删除该函数的第一行。与原始脚本不同,该脚本的输出保留了第一个字符:
Pinging google.com [74.125.225.105] with 32 bytes of data:
Reply from 74.125.225.105: bytes=32 time=253ms TTL=43
Ping statistics for 74.125.225.105:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 253ms, Maximum = 253ms, Average = 253ms
"Pinging"
"google.com [74.125.225.105] with 32 bytes of data:"
"Reply"
"from 74.125.225.105: bytes=32 time=267ms TTL=43"
"Ping"
"statistics for 74.125.225.105:"
"Packets:"
"Sent = 1, Received = 1, Lost = 0 (0 loss),"
"Approximate"
"round trip times in milli-seconds:"
"Minimum"
"= 267ms, Maximum = 267ms, Average = 267ms"