替代grep以隔离Windows命令行中的特定文本

时间:2016-03-04 15:30:25

标签: regex windows batch-file cmd

我的网络动态变化,不幸的是我被迫运行Windows。

这个脚本有效,因为我已经为Windows安装了GNU工具,可以使用grep。

我希望能够在任何Windows机器上运行此脚本,而无需安装任何东西(grep等)。我最初在这里使用了findstr,但是无法让它只显示匹配正则表达式字符串的内容。

@echo off

set %IPLIST% = nul
Echo.
Echo "Pinging all local Gateways"
    ipconfig | findstr /i "Gateway" | grep -o "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" > %IPLIST%

For /F "Usebackq Delims=" %%# in ("%IPLIST%") 
do (
    Echo+
    Echo [+] Pinging: %%#

Ping -n 1 "%%#" 1>nul && (
    Echo     [OK]) || (
    Echo     [FAILED])
)

Echo.
Echo.

Echo "now testing your internet connection"
Echo .
Echo ...

if %errorlevel% == 0 (
    echo ....you're all good bro.
) else (
    ping -n 3 "8.8.8.8" | findstr /r /c:"[0-9] *ms"
    if %errorlevel% == 1 (
echo ....all is lost
)
)
Echo.

1 个答案:

答案 0 :(得分:2)

脚本存在许多问题。

set %IPLIST% = nul

这会产生语法错误,因为iplist可能未定义,并且您正在尝试将变量contents of iplist设置为“nul”

解决方法是

set  = nul

此外,=两侧的空格都包含在变量/值集中,因此删除% s会将iplist Space 的值设置为< KBD>空间 NUL

如果iplist确实已设置为nul,则您的ipconfig命令只会将其最终输出转储到比特桶中,因为它将被发送到nul }。

For /F "Usebackq Delims=" %%# in ("%IPLIST%") 

do (必须与“for”

位于同一物理行
<opinion>Using non-alphas as metavariables is not a good idea as it is not officially supported <\opinion>

if %errorlevel% == 0 (
    echo ....you're all good bro.
) else (
    ping -n 3 "8.8.8.8" | findstr /r /c:"[0-9] *ms"
    if %errorlevel% == 1 (
echo ....all is lost
)
)

由于delayed expansion trap(块中的所有%var%(带括号的语句序列)被替换为分析时的值,因此最内层%errorlevel%当遇到最外层的errorlevel时,此处将被设置为if所取代。要解释ping输出,您需要调用delayedexpansion(此主题上有很多很多SO项)或使用旧的if errorlevel n...构造,{{1}如果当前iferrorlevel或大于n,则条件为真。

所以 - 使用批处理功能重建

n

'for / f @ECHO OFF SETLOCAL Echo. Echo "Pinging all local Gateways" For /F "tokens=2 Delims=:" %%a in ('ipconfig ^| findstr /i "Gateway"') DO IF "%%a" neq " " ( Echo+ Echo [+] Pinging: %%a Ping -n 1 %%a 1>nul && ( Echo [OK]) || ( Echo [FAILED]) ) Echo. Echo. Echo "now testing your internet connection" Echo . Echo ... if %errorlevel% == 0 ( echo ....you're all good bro. ) else ( ping -n 3 "8.8.8.8" | findstr /r /c:"[0-9] *ms" if ERRORLEVEL 1 IF NOT ERRORLEVEL 2 ( echo ....all is lost ) ) Echo. GOTO :EOF tokenises the output of the command in single-quotes using %% a。。

as a delimiter and picking the second token to apply to需要通过插入符来转义,告诉|它是要执行的命令的一部分,而不是cmd的一部分。

for处理for的输出,因此ipconfig...的格式为Spacexxx.xxx.xxx.xxx

在我的机器上,%%a在一行中丢失,因此我过滤掉了单空间响应。

在没有引号的情况下ping xxx... 会在%%a行中添加额外的空格,这是无害的。有了引号,它不喜欢它。

然后是附录......

我不确定你在这里尝试的是什么。也许这是一次令人沮丧的调试尝试。

ping将设置为errorlevel ping结果。这在逻辑上是不可预测的。

我已经展示了解释last错误级别结果的正确方法。我不确定您的正则表达式是否正确...但只有findstr将errorlevel设置为1时才会显示all is lost消息。