我的网络动态变化,不幸的是我被迫运行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.
答案 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}如果当前if
为errorlevel
或大于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
消息。