Windows批处理 - 小程序大作用
2016-10-19 18:14
155 查看
写Windows的批处理程序,一般只是想实现一些简单的功能。例如将文件夹下的文件批量改后缀名,一句
但是这并不代表批处理只能用于实现这种近乎一次性的功能。
本人在某制造业的工作期间,生产线电脑的维护一直是一个很棘手的事情。因为生产线是24小时工作,控制产线的PC也是24小时运转,软件运行难免有垃圾。
但是软件厂商一般都不会处理这方面的问题。
当时碰到的难题是:
有 2年 * 365天 * 24小时 * 100个记录 * 10 共计17520000个文件需要你删除,你会怎么做?
(文件夹层次就是按照 日期\小时\产品编号\产品记录 存放,软件有删除文件的功能,但是居然不删文件夹,文件夹多了软件特别容易在存图时卡死,而且奇葩的是居然好几十台电脑两年没有人去删它!!!)
直接右键删除父级目录?图样图森破图内卫!Windows是需要把文件句柄全都处理之后再进行确认删除的(表达可能有误,但是意思肯定没错),等它将这千万个文件处理完然后你再来点击确定?我估计你第二天也等不到,况且这段时间电脑的卡顿让你没法保证生产线的正常运行。再说当月的文件规定是不能删除的。
一天或者一个月的删除?可以!每天专人负责,可以删掉四个月左右。产线里电脑大概有50多台需要做这样的工作。。。
用Batch批处理就简单多了,
这样,程序就能够自动遍历文件夹到小时级,然后静默删除。
继续但是!上面是直接遍历12个月份31天24个小时,而且路径也是固定的。不要指望教别人一两句别人就知道这个文件可以怎么改,更不要指望谁都能看懂上面的代码。
处女座的程序猿怎么能够满足于这种半成品?!自己整理了一下这个程序的需求
需要能够设定删除的时间段,最好能自动判断需要删除的时间段
需要能够设定删除的文件夹,最好能设定多个路径
最好能够设置密码,防止不相关人员的误操作
于是我的AutoDelete程序出现了
Path.cfg 用来存放需要删除的文件夹路径
AutoDelete.bat 从这个文件运行会保留最近两个月的文件,其他的删除(不同年同月份的文件会在一起,所以没进行处理)
DeleteByMonth.bat 从这个文件运行会要求你输入需要删除的月份
Login.bat 一个简单的密码验证,怕别人误操作
Delete.bat 根据上面的设置进行遍历删除
功能实际上依然很简单,也就是处理一下路径,然后删除文件夹。加了一些乱七八糟的输出语句,加了一些可调的参数,整个程序就显得高大上了(当然,这只是对于不懂的人)。现在要删除这些文件,双击输入密码确认后,什么都不用管,完活后去确认一下就行。
当然,可能会有人觉得,这种东西用个高级语言写起来多爽,路径处理都不用自己写,什么语言还没有个File库?
但是当你电脑上没有编译器,要方便随时改代码,产线电脑又不让随便运行程序时,记事本和批处理真的是一大福星,随时随地改,走哪用到哪。
在做出了这个能应用在好几十台电脑上的bat程序之后,文件自动备份,网络代理切换,磁盘检查并保存日志,电脑开WiFi。。。好多事情都慢慢在学习批处理的过程中从复杂的操作变成了傻瓜式的双击运行,文件或者代码直接发给别人也可以用。这些程序我都会继续修改加强程序的通用性,用法和代码也会在之后的文章中进行整理。
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。。。好多事情都慢慢在学习批处理的过程中从复杂的操作变成了傻瓜式的双击运行,文件或者代码直接发给别人也可以用。这些程序我都会继续修改加强程序的通用性,用法和代码也会在之后的文章中进行整理。
相关文章推荐
- java程序中String args[]起什么作用?
- 客观看待ViewState对Asp.net程序作用和影响
- 在asp程序中Buffer的作用
- Return、Continue、Break在程序流程控制中作用
- C# 程序中using的作用
- java程序中String args[]起什么作用?
- 在socket通讯程序里,select 起到什么作用
- 程序系统的复杂性之二---- 原型的负作用
- 客观看待ViewState对Asp.net程序作用和影响
- [小程序大道理]java中static的作用
- 在特定程序中使键盘不发挥作用VB
- Explorer.exe程序在系统中的作用
- 介绍一下msconfig(系统配置实用程序)里的服务的作用:
- 程序主界面的作用
- [小程序大道理]java中static的作用
- 程序语言的静态作用域和动态作用域
- msicuu.exe (msizap.exe),程序的作用
- algo1-4.cpp 说明exit()函数作用的程序
- [转贴]Windows批处理调用程序后如何自动退出
- 请问,在下面这个函数中m_pMainWnd = &dlg;的作用是什么?为什么我把这句话注释起来之后程序依然是正确的啊?