【问题标题】:Echo is not working correctly in my Windows Batch scriptEcho 在我的 Windows 批处理脚本中无法正常工作
【发布时间】:2018-02-04 13:36:49
【问题描述】:

主要问题:

ECHO 命令忽略标记参数之前的所有字符,并在输出中的标记之前插入标记参数之后的所有文本:

这是脚本:

@ECHO OFF
FOR /F "USEBACKQ TOKENS=2 DELIMS==" %%a IN (`
    WMIC NIC WHERE 
            "MACAddress IS NOT NULL" 
        GET 
            MACAddress 
        /FORMAT:LIST ^| 
        FINDSTR /V /R "^%"
`) DO (
    ECHO [%%a]
    ECHO 0123456789%%a9876543210
)
PAUSE > NUL

这是预期的输出:

[AA:BB:CC:11:22:33]
0123456789AA:BB:CC:11:22:339876543210

这是实际输出:

]AA:BB:CC:11:22:33
9876543210AA:BB:CC:11:22:33

我为什么要关心?

我的意图是用这个块替换上面示例中的 DO () 块:

:: ...FOR LOOP STUFF...
`) DO (
    WMIC NIC WHERE ^
        "MACAddress=%%a" ^
    GET ^
        NetConnectionID ^
    /FORMAT:LIST | FINDSTR /V /R "^$"

    WMIC NICCONFIG WHERE ^
        "MACAddress=%%a" ^
    GET ^
        DefaultIPGateway,^
        DNSServerSearchOrder,^
        IPAddress,^
        IPSubnet,^
        MacAddress ^
    /FORMAT:LIST | FINDSTR /V /R "^$"
)

如上所述,处理脚本时,%%a 之前的所有字符都会被截断,%%a 之后的所有字符都会显示在 %%a 之前。有人请帮忙,我在这里象征性地哭泣。

【问题讨论】:

  • 你能把它缩小到一个更简单的脚本吗?
  • 好吧,我用 (`ECHO TEST`) 替换了反引号部分,并且输出如预期的那样是 [TEST]。所以看起来这个问题可能特定于 WMIC 输出。
  • 我还用 FOR /F "USEBACKQ TOKENS=*" %%a IN (`WMIC NIC GET MACAddress`) 替换了开头部分,并观察到与第一个示例相同的输出问题。
  • 这……很奇怪。就在我没有实际测试任何东西的情况下,我猜它可能与您正在使用的正则表达式字符串有关。 % 符号需要在批处理脚本中加倍,因此请尝试使用 findstr /V /R "^%%"
  • wmic 有一个已知的错误,即输出带有 cr/cr/lf 序列的行。这里我不会使用 wmic 而是程序 Getmac.exe

标签: windows batch-file cmd echo token


【解决方案1】:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR /F "TOKENS=2 DELIMS==" %%a IN ('
    WMIC NIC WHERE "MACAddress IS NOT NULL" GET MACAddress 
        /FORMAT:LIST 
') DO (
 SET "macaddr=%%a"
 SET "macaddr=!macaddr:~0,-1!"
    ECHO [!macaddr!]
    ECHO 0123456789!macaddr!9876543210
)

GOTO :EOF

我找不到findstr 的原因 - 正如发布的那样,代码根本没有给我任何输出。删除 findstr 提供了报告的输出。

wmic 怪癖可以通过将wmic 输出重定向到文件并使用十六进制编辑器检查结果来观察。解决方法是简单地机械地删除分配给令牌的值的最后一个字符。

【讨论】:

  • 太棒了,我从来没有想过这样做。这使我可以避免使用 GETMAC 并使用所有 WMIC。我使用了FINDSTR /V /R "^$",因为我没有在我的 SET 命令中使用引号,这会在我的循环中导致换行输出(显示ECHO is off.)。我应该使用SET "_MACAddress=%%a" 而不是SET _MACAddress=%%a
【解决方案2】:

我只是在这个脚本中使用Getmac 命令:

@echo off
mode 80,5 & Color 9E
Title Get (LAN ,Public) (IP) and MAC Addresses by Hackoo 2017
cls
echo( & echo(
echo   Please Wait a While ... Searching for (LAN ,Public)(IP) and MAC addresses ...
@for /f "delims=[] tokens=2" %%a in ('ping -4 -n 1 %ComputerName% ^| findstr [') do (
   set "LAN_IP=%%a"
)

for /f "tokens=2 delims=: " %%A in (
  'nslookup myip.opendns.com. resolver1.opendns.com 2^>NUL^|find "Address:"'
) Do set ExtIP=%%A


@For /f %%a in ('getmac /NH /FO Table') do  (
   @For /f %%b in ('echo %%a') do (
       If /I NOT "%%b"=="N/A" (
            Set "MY_MAC=%%b"
        )
    )
)
    Cls
    echo(
    echo                My Private LAN IP       : %LAN_IP%
    echo                My External Public IP   : %ExtIP%
    echo                MAC Address             : %MY_MAC%
Timeout /T 5 /NoBreak>nul & Exit 

【讨论】:

  • 这是一个壮观的脚本。非常好的输出格式。无需 PowerShell 即可获取公共 IP 地址的非常酷的方法。
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多