CMD For / f循环删除第二个(*)标记上的第一个字符

时间:2013-02-04 07:41:27

标签: for-loop windows-xp cmd ping

关于为什么以下type批处理文件的for /f循环没有在Windows XP上显示第二个标记(*)的第一个字符的任何想法(仅限)?

注意:set "test=%%a"是使用ping来解决问题,只在其输出中输入<CR>而不是<CR><LF>?在jeb

中由this comment to my answer实现的Windows XP

2 个答案:

答案 0 :(得分:2)

在Windows XP中,ping命令似乎在行尾之前生成了额外的0x0D(回车)字符。因此,当%%b收到一个值时,它会与尾随的CR char一起接收它。当你打印%%b时,CR自然会使“car”返回到行的开头,因此关闭"和后续空格字符({{1}之间的那个) }和")覆盖已打印的前两个字符,即开头&和值的第一个字母。

您可以通过将"的输出重定向到文件,然后在十六进制查看器中查看文件来轻松验证它。我使用Far Manager的内置查看器来确定事实:

  • 这是文件的普通视图,突出显示任意行结尾:

    enter image description here

  • 这是十六进制视图模式下的同一个文件,此处也突出显示相同的区域,以显示该行实际结束的字符:

    enter image description here

对于非英文内容感到抱歉,还没有得到英文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"