无忧启动论坛

标题: 探测dns 畅通的cmd脚本 [打印本页]

作者: dos时代菜鸟    时间: 2012-1-21 18:51
标题: 探测dns 畅通的cmd脚本
p_DNS2.7z (951 Bytes, 下载次数: 76)

临时编辑了一个 探测 本机网络设置中的全部 DNS 是否畅通的脚本。总觉得还可以简化一些。大家一起研究一下吧。
涉及cmd命令:netsh / for /findstr /set /if /goto /call /echo /ping /管道 / ">"传递 / & 符号 / errorlevel应用 /SETLOCAL

本脚本理论上兼容 英文 cmd 环境。只需将中文提示翻译一下即可。




---------------------------
findstr 能否实现 找出同时具有如下特征的行?
包含冒号,被 冒号 分割的第一部分包含 " DNS " 字样,被冒号分割的第二部分 包含[0-9][.][0-9] 字样。



------------------------------------代码: ---------------
@echo off & SETLOCAL ENABLEDELAYEDEXPANSION
rem  用 for 分析 "netsh interface ip show dns" 指令得出的结果
REM  m 作为信息行数计数器
REM  n 作为DNS信息块起始行标记器
rem  如果 当前行包含 冒号 时,将 n 赋值为 0
rem  并将当前行被冒号分割的第二部分信息赋值给变量 !DNS!,否则,将第一部分信息赋值给变量 !DNS!
rem  当  冒号 分割的第一部分信息中包含" DNS "字样,将 n 赋值为 M
rem  如此,当 n=0 时表示进入了一个信息模块。
REM  当 n<>0 时表示当前信息模块饱含了 dns 信息,变量!DNS!的内容可用,则调用脚本 p 段代码。
rem  脚本附带 一个参数"debug" ,当执行附带此参数时,运行过程附带显示变量 m n dns 的内容。

title 检测 DNS 畅通情况...
set /A m=0 & set /A n=0
echo 正在获取 DNS 设置....
ECHO.
for /f "delims=" %%c in ('netsh interface ip show dns') do (
set /a m=!m!+1
set l=%%c & set l=!l:"=_!
for /f "tokens=1,2 delims=:" %%f in ("!l!") do (
   echo %%c | findSTR  /C:":" >nul
   if not errorlevel 1 (
     set /A n=0 & set "dns=%%g"
     ECHO %%f | findstr /C:" DNS " >nul
     if not errorlevel 1  set /a n=!m!
   )  else ( set "dns=%%f"   )
)
set dns=!dns: =!
if %1*==debug* ECHO 第*!M!*行: DNS标记=*!n!* DNS=!DNS!
if not !n!==0  call:p
)
)

echo 检测完毕,按任意键退出! & pause >nul
GOTO :eof

:p
ECHO 检测网路 !DNS!..........
ping !DNS! -n 3 >nul
if not errorlevel 1 (echo DNS:[!dns!] 畅通!) else (echo DNS:[!dns!] 不通!)
ECHO.




[ 本帖最后由 dos时代菜鸟 于 2012-1-21 19:42 编辑 ]
作者: dos时代菜鸟    时间: 2012-1-21 19:06
要只检查第一个 DNS ,就简单多了。一句话就可以解决。p处理都不用编。

for /f "delims=: tokens=2" %c in ('ipconfig /all^| find /i "dns servers"') do (@ping %c -t)

[ 本帖最后由 dos时代菜鸟 于 2012-1-22 09:18 编辑 ]
作者: dos时代菜鸟    时间: 2012-1-22 09:15
利用 wmic 的 nicconfig 别名功能,实现这个目的会更简单一些
涉及命令: wmic /setlocal /echo /for /if /errorlevel /set /goto /findstr /ping

--------------------代码:--------
@echo off & SETLOCAL ENABLEDELAYEDEXPANSION
title 检测 DNS 畅通情况...
echo 正在获取 DNS 设置....
echo.
for /f "skip=1 delims=} tokens=1" %%c in ('wmic nicconfig get DNSServerSearchOrder') do (
  set "l1=%%c"
  set "l1=!l1:{=!"
  for %%x in (!l1!) do call:p %%~x
)
echo 检测完毕,按任意键退出! & pause >nul
GOTO :eof
:p
ECHO 检测网路 %1..........
ping %1 -n 3 >nul
if not errorlevel 1 (echo DNS:[%1] 畅通!) else (echo DNS:[%1] 不通!)
ECHO.


[ 本帖最后由 dos时代菜鸟 于 2012-1-22 09:18 编辑 ]
作者: freesoft00    时间: 2012-1-22 10:25
支持并欣赏一下,新年快乐了!


另外请教一个问题
  1. @echo off
  2. color 4f
  3. ::=================================================================================================
  4. set ph=%~sdp0
  5. title=%ph%
  6. for /f "tokens=2,*" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Security Client" /v "InstallLocation"') do (
  7. set MSEinstall=%%j
  8. )
  9. ping 127.0.0.1 -n 2 >nul
  10. :start
  11. title (*^__^*)
  12. cls
  13. set select=
  14. set /p select=【选择M将下载离线更新包,选择U调用命令行更新程序】:
  15. if /i "%select%"=="M" (
  16. goto select
  17. ) else (
  18. if /i "%select%"=="U" (
  19. goto up
  20. ) else (
  21. goto start
  22. )
  23. )
  24. :up
  25. title %MSEinstall%\Antimalware\MpCmdRun.exe
  26. "%MSEinstall%\Antimalware\MpCmdRun.exe" -SignatureUpdate
  27. msg %username% "命令行方式更新结束"
  28. ping 127.0.0.1 -n 3 >nul
  29. goto start
  30. ::====================================================================================================
  31. :select
  32. set sa=NA
  33. set ss=NA
  34. if not exist "%ph%mpam-fe.exe" (goto s1) else (goto s2)
  35. goto start
  36. :s1
  37. cls
  38. set /p sa=【选择y返回,其他键将下载更新包】:
  39. if /i "%sa%"=="y" (goto start) else (goto pack)
  40. goto s1
  41. :s2
  42. cls
  43. echo 下载结束或mpam-fe.exe已存在
  44. set /p ss=【选择y将重新下载离线更新包,其他键安装更新包】:
  45. if /i "%ss%"=="y" (
  46. del /f /a /q "%ph%mpam-fe.exe"
  47. ping 127.0.0.1 -n 2 >nul
  48. goto pack
  49. ) else (
  50. goto setup
  51. )
  52. goto s2
复制代码


reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Security Client" /v "InstallLocation"
如果不存在上面的注册表键值会在批处理中显示错误,怎么样屏蔽这个错误?

[ 本帖最后由 freesoft00 于 2012-1-22 10:29 编辑 ]
作者: dos时代菜鸟    时间: 2012-1-22 11:36
标题: 回复 #4 freesoft00 的帖子
reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Microsoft Security Client" /v "InstallLocation"   2^>nul

看看能用不。

[ 本帖最后由 dos时代菜鸟 于 2012-1-22 11:39 编辑 ]
作者: freesoft00    时间: 2012-1-22 13:49
我开始加的是>nul 2>nul,为什么就不行呢,运行后一闪而过。而你这个就可以。




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3