您的位置:首页 > 移动开发 > 微信开发

Windows批处理 - 小程序大作用

2016-10-19 18:14 155 查看
写Windows的批处理程序,一般只是想实现一些简单的功能。例如将文件夹下的文件批量改后缀名,一句
rename "*.lua" "*.txt"
就能实现,不需要编译,一个记事本一句话就可以搞定。

但是这并不代表批处理只能用于实现这种近乎一次性的功能。

本人在某制造业的工作期间,生产线电脑的维护一直是一个很棘手的事情。因为生产线是24小时工作,控制产线的PC也是24小时运转,软件运行难免有垃圾。

但是软件厂商一般都不会处理这方面的问题。

当时碰到的难题是:

有 2年 * 365天 * 24小时 * 100个记录 * 10 共计17520000个文件需要你删除,你会怎么做?

(文件夹层次就是按照 日期\小时\产品编号\产品记录 存放,软件有删除文件的功能,但是居然不删文件夹,文件夹多了软件特别容易在存图时卡死,而且奇葩的是居然好几十台电脑两年没有人去删它!!!)

直接右键删除父级目录?图样图森破图内卫!Windows是需要把文件句柄全都处理之后再进行确认删除的(表达可能有误,但是意思肯定没错),等它将这千万个文件处理完然后你再来点击确定?我估计你第二天也等不到,况且这段时间电脑的卡顿让你没法保证生产线的正常运行。再说当月的文件规定是不能删除的。

一天或者一个月的删除?可以!每天专人负责,可以删掉四个月左右。产线里电脑大概有50多台需要做这样的工作。。。

用Batch批处理就简单多了,
rd /s /q
,运行起来都不用你管。要保证运行不卡?文件夹遍历到小时,一小时一小时删总没问题了吧。

@echo off
setlocal enabledelayedexpansion

for /l %%i in (1,1,12) do (
set /a m=%%i+100
set m=!m:~-2!
for /l %%j in (1,1,31) do (
set /a d=%%j+100
set d=!d:~-2!
for /l %%k in (0,1,23) do (
set /a h=%%k+100
set h=!h:~-2!
rem 设置要删除的路径的父级路径
set p="D:\AllImage\Table1"
rd /s /q !p!\!m!-!d!\!h!
)
rd /s /q !p!\!m!-!d!
)
)

pause


这样,程序就能够自动遍历文件夹到小时级,然后静默删除。

继续但是!上面是直接遍历12个月份31天24个小时,而且路径也是固定的。不要指望教别人一两句别人就知道这个文件可以怎么改,更不要指望谁都能看懂上面的代码。

处女座的程序猿怎么能够满足于这种半成品?!自己整理了一下这个程序的需求

需要能够设定删除的时间段,最好能自动判断需要删除的时间段

需要能够设定删除的文件夹,最好能设定多个路径

最好能够设置密码,防止不相关人员的误操作

于是我的AutoDelete程序出现了

Path.cfg 用来存放需要删除的文件夹路径

path1=D:\AllImage\Table1
path2=D:\AllImage\Table2
path3=D:\FailImage\Table1
path4=D:\FailImage\Table2
path5=D:\Images\Table1
path6=D:\Images\Table2


AutoDelete.bat 从这个文件运行会保留最近两个月的文件,其他的删除(不同年同月份的文件会在一起,所以没进行处理)

@echo off
setlocal enabledelayedexpansion

rem Parameter
set ms=1
set me=10
set ds=1
set de=31
set hs=0
set he=23

set /a ms=1%date:~5,2%+!ms!-100
set /a me=1%date:~5,2%+!me!-100

Call .\CFG\Login.bat


DeleteByMonth.bat 从这个文件运行会要求你输入需要删除的月份

@echo off
setlocal enabledelayedexpansion

rem Parameter
set /p ms=Please set the month you want to delete:
set me=!ms!
set ds=1
set de=31
set hs=0
set he=23

Call .\CFG\Login.bat


Login.bat 一个简单的密码验证,怕别人误操作

set /p password="please input your password:"
if %password%==0000 goto pwcorrect else goto pwwrong

:pwwrong
echo "password is wrong!!"
echo "press anykey to exit..."
pause>nul
exit

:pwcorrect
echo "access available"
echo "AutoDelete will be running, you can exit this program in anytime..."
ping 127.0.0.1 -n 03>nul
echo -------------------------------------------
echo "press anykey to confirm your operation..."
pause>nul
Call .\CFG\Delete.bat


Delete.bat 根据上面的设置进行遍历删除

set /a ms=!ms!-1
set /a me=!me!-1

for /l %%i in (!ms!,1,!me!) do (
set /a m=%%i %% 12+101
set m=!m:~-2!
for /l %%j in (!ds!,1,!de!) do (
set /a d=%%j+100
set d=!d:~-2!
for /f "tokens=2* delims==" %%t in (.\CFG\Path.cfg) do (
set p=%%t

echo "----------!p!\!m!-!d! Delete Start----------"
for /l %%k in (!hs!,1,!he!) do (
set /a h=%%k+100
set h=!h:~-2!

echo ----
echo "!p!\!m!-!d!\!h! Delete Start"
rd /s /q !p!\!m!-!d!\!h!
echo "!p!\!m!-!d!\!h! Delete Complete"
echo ----
)
rd /s /q !p!\!m!-!d!
echo "----------!p!\!m!-!d! Delete Complete----------"
)
)
)

pause


功能实际上依然很简单,也就是处理一下路径,然后删除文件夹。加了一些乱七八糟的输出语句,加了一些可调的参数,整个程序就显得高大上了(当然,这只是对于不懂的人)。现在要删除这些文件,双击输入密码确认后,什么都不用管,完活后去确认一下就行。

当然,可能会有人觉得,这种东西用个高级语言写起来多爽,路径处理都不用自己写,什么语言还没有个File库?

但是当你电脑上没有编译器,要方便随时改代码,产线电脑又不让随便运行程序时,记事本和批处理真的是一大福星,随时随地改,走哪用到哪。

在做出了这个能应用在好几十台电脑上的bat程序之后,文件自动备份,网络代理切换,磁盘检查并保存日志,电脑开WiFi。。。好多事情都慢慢在学习批处理的过程中从复杂的操作变成了傻瓜式的双击运行,文件或者代码直接发给别人也可以用。这些程序我都会继续修改加强程序的通用性,用法和代码也会在之后的文章中进行整理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  批处理 Batch