一些Cmd的自动化脚本

cmd,Jlink,plink

Posted by elmagnifico on July 29, 2017

Foreword

有些批量工作,如果一个一个完成,太麻烦了,这里记录一些脚本,用来批量完成某一些任务。

大部分都是基于 Cmd 命令和对应支持的命令工具而已

简单说拿已有固件,反复烧写大量板子,本质上还是同过Jlink而已,需要安装Jlink驱动。

这个是基于JLink_Windows_V614版本的,更老的版本,有可能命令不支持或者略有不同。

这里的 JLink.exe 其实就是 J-Link Commander 或者说是 linux 下的 JLinkExe 而已。

当然其实也可以用 J-Flash 带 UI 的进行烧写,就是麻烦一点而已

Flash.bat

@echo off
:start
echo 确保你当前J-Link驱动正常,并且连接到了对应的接口上
set "answer=0"
echo 输入1 烧写MCU,2 烧写IMU,3 烧写GPS 回车开始烧写
set /p answer=
if "%answer%"=="1" (echo 开始烧写MCU
JLink.exe <F407MCU.txt
goto note)
if "%answer%"=="2" (echo 开始烧写IMU
JLink.exe <F407IMU.txt
goto note)
if "%answer%"=="3" (echo 开始烧写GPS
JLink.exe <F103GPS.txt
goto note)
:note
echo 注意查看返回信息中是否有 Failed
echo 如果有重新刷,正确情况下是successful
echo 正确烧写:读完进度条之后有烧写时间提示
echo 如果提示skipped 表示已有固件和当前相同
goto start

F103GPS.txt 这里是 Jlink 具体执行的命令文件

usb
si 1
speed 4000
device stm32f103c8
loadfile c:\f103GPS.bin
verifybin c:\f103GPS.bin 0x8000000
r
go
q

plink 知道的人比较少,而且相关资料其实也非常少。

plink 是 PuTTY 的命令行模式而已,本质上就好像 J-Link Commander 是 J-Flash 的命令行而 已。

-m 表示会执行其后面的文件中的所有 shell 命令

@echo off
echo 如果中途遇到了需要输入的情况,请输入y回车
echo signal后跟信号强度,Link Quality 表示连接质量
:start
plink.exe [email protected] -pw raspberry -m .\commands.txt
plink.exe [email protected] -pw raspberry -m .\commands.txt
pause
goto start

commands.txt 中的内容,只是用来显示当前 Wlan 的信号强度等信息而已

替换成其他命令一样也是可行的,需要注意的是,可能都需要有 root 权限才能如此操作。

sudo iw dev wlan0 link | grep -i --color signal
sudo iwconfig wlan0| grep -i --color Quality

切换 DHCP / 静态 IP

这里是把名为 WLAN 的无线网络修改成了静态IP,对应不同的网络,自然需要修改下面的网络名, 否则会提示找不到对应的网络

@echo off
cls
Echo ***************************************************************************
Echo           正在修改IP地址和DNS服务器地址,请耐心等待…………
Echo ***************************************************************************
cmd /c netsh interface ip set address name="WLAN" source=static addr=192.168.1.1 mask=255.255.255.0 gwmetric=1
Echo ***************************************************************************
Echo          OK!!已修改成功!请按任意键继续…………
Echo ***************************************************************************
Pause

这里是把名为 WLAN 的无线网络修改成了自动IP,并且刷新了一次 dns 缓冲池。 对应不同的网络,自然需要修改下面的网络名,否则会提示找不到对应的网络

@echo off
cls
Echo ***************************************************************************
Echo           正在修改IP地址和DNS服务器地址,请耐心等待…………
Echo ***************************************************************************
netsh interface ip set address name="WLAN" source=dhcp
ipconfig /flushdns
Echo ***************************************************************************
Echo          OK!!已修改成功!请按任意键继续…………
Echo ***************************************************************************
Pause

查询子网中的IP

有时候需要知道子网中IP都有哪些,可以去ping,但是如果根本不知道对方ip,挨个ping就有点傻了

使用下面的办法能直接看到路由表

arp -a

但是由于是路由表,所以只能表示这个ip曾经连接过,或者说曾经路由过,并不一定现在还在线,而且如 果你没有和某个ip产生过通信的话,那么arp中并不会记录这个ip.

那么这个时候要查某个未知未连接过的ip,就需要全部ping一遍了.

for /L %i IN (101,1,233) DO ping -w 200 -n 1 192.168.1.%i

简单说,从101开始到233,全部ping一遍,其中 -w 200 表示只等待200ms,大于200ms就认为超时了, 超时时间根据实际情况而定.

下面的批处理则是显示了本机IP,并且首先清空了路由表,然后依次ping,之后再次查询路由表,从而得 到上一刻在线的ip

COLOR 0A
CLS
@ECHO Off
Title 查询局域网内在线IP
:send
@ECHO off&setlocal enabledelayedexpansion
ECHO 正在获取本机的IP地址,请稍等...
for /f "tokens=4 skip=2 delims=: " %%i in ('nbtstat -n') do (
set "IP=%%i"
set IP=!IP:~1,-1!
ECHO 本机IP为:!IP!
goto :next
)
:next
ECHO.
ECHO 正在获取本网段内的其它曾加入路由表的IP(并不一定表示在线,只是表示连接过),请稍等...
ECHO 清空当前路由表连接记录,需要使用管理员权限运行本bat
arp -d
for /L %%j IN (101,1,233) DO ping -w 2 -n 1 192.168.1.%%j
for /f "skip=3 tokens=1,* delims= " %%i in ('arp -a') do ECHO IP: %%i 处于路由表中
ECHO.
ECHO 查询完毕,按任意键退出...
pause>nul

下面的是一个查询所有子网ip,并且将记录保存到本地文件中.

@echo off
title 查询所有子网IP

set /a Online=0
set /a Offline=0
set /a Total=256
set ExportFile=子网IP在线统计.txt
:: 初始化在线IP与不在线IP的个数为0,共扫描256个IP,结果输出到本目录下的子网IP在线统计.txt

set StartTime=%time%
:: 记录程序的开始时间

for /f "delims=: tokens=2" %%i in ('ipconfig /all ^| find /I "IPv4 地址"') do set IP=%%i
:: 获得本机IP 如果出现未连接,一般都是 "IPv4 地址" 这个字段没搜索到 自己用一下ipconfig
:: 查询一下对应的IP字段是什么开头的就行了

if "%IP%"=="" echo 未连接到网络 & pause & goto :EOF
if "%IP%"==" 0.0.0.0" echo 未连接到网络 & pause & goto :EOF
:: 当IP为空或 0.0.0.0 时,提示未连接并退出该程序

for /f "delims=. tokens=1,2,3,4" %%i in ("%IP%") do (
  set /a IP1=%%i
  set /a IP2=%%j
  set /a IP3=%%k
  set /a IP4=%%l
)
:: 这里其实可以修改查询的IP子网 无视循环直接修改,实际上这里获取的是最后一个IP地址
:: 以句点为分隔符,分别将IP的四个十进制数赋给四个变量

set /a IP4=0
echo 在线的IP:>%ExportFile%
:: 初始化IP的第四个数值为0,并创建结果输出文件,需要查询的起点在这里

:RETRY
ping %IP1%.%IP2%.%IP3%.%IP4% -n 1 -w 200 -l 16>nul && set /a Online+=1 && echo %IP1%.%IP2%.%IP3%.%IP4%>>%ExportFile% || set /a Offline+=1
:: ping 目标IP


set /a Scanned=%Online%+%Offline%
set /a Progress=(%Online%+%Offline%)*100/%Total%
echo 正在扫描:%Scanned%/%Total% 扫描进度:%Progress%%%

set /a IP4+=1
:: 每次查询的步长在这里
if %IP4% lss %Total% goto :RETRY
:: 当IP的第四个数值小于总数时,跳转回 :RETRY 处,重复执行直到全部 ping 完为止

echo.
echo.

set EndTime=%time%
:: 记录程序的结束时间

set /a Seconds = %EndTime:~6,2% - %StartTime:~6,2%
set /a Minutes = %EndTime:~3,2% - %StartTime:~3,2%
if %Seconds% lss 0 set /a Seconds += 60 & set /a Minutes -= 1
if %Minutes% lss 0 set /a Minutes += 60
:: 计算时间差

set /a Percent=%Online%*100/(%Online%+%Offline%)
:: 计算在线百分比

echo 在线IP个数:  %Online%
echo 不在线IP个数: %Offline%
echo 在线百分比:  %Percent%%%
echo 统计耗时:   %Minutes%分%Seconds%秒
echo 统计日期:   %date% %time:~0,-3%
echo.>>%ExportFile%
echo 在线IP个数:  %Online%>>%ExportFile%
echo 不在线IP个数: %Offline%>>%ExportFile%
echo 在线百分比:  %Percent%%%>>%ExportFile%
echo 统计耗时:   %Minutes%分%Seconds%秒>>%ExportFile%
echo 统计日期:   %date% %time:~0,-3%>>%ExportFile%
echo 记录已保存到文件"%ExportFile%"中
::显示结果并将结果保存到文件中
pause

Summary

目前只遇到了上面的几个,日后有用到的,继续补充

Quote