1

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

注意:set "test=%%a"是为了解决问题ping¿ 只放入 a<CR>而不是<CR><LF>它的输出?Windows XP正如jeb对我的回答的评论中所意识到的那样

4

2 回答 2

2

看来,在 Windows XP 中,该命令会在行尾之前ping生成一个额外的(回车)字符。0x0D结果,当%%b接收到一个值时,它会与尾随的 CR 字符一起接收它。当你在打印时%%b,CR自然会导致“马车”返回到行首,因此结束"符和随后的空格字符(和之间的那个"&会覆盖已经打印的前两个字符,即开始"和值的第一个字母。

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

  • 这是文件的正常视图,其中突出显示了任意行结尾:

    在此处输入图像描述

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

    在此处输入图像描述

抱歉,非英文内容,手边没有英文Win XP。希望这个问题仍然可以从镜头中明显看出。

于 2013-02-04T09:07:23.357 回答
1

有趣的。根据没有@echo off.

但是,如果您将参数传递给函数,如下所示,它似乎在 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"
于 2013-02-04T08:01:28.830 回答