设为首页 收藏本站
查看: 879|回复: 0

[经验分享] 探索Windows命令行系列(6):活用批处理解决实际问题

[复制链接]

尚未签到

发表于 2017-12-7 16:38:14 | 显示全部楼层 |阅读模式

  • 1、批量修改文件名
  • 2、批量重启服务
  • 3、全盘搜索指定文件

    • 3.1、全盘搜索名称为 mm.jpg 的文件,获取其全路径
    • 3.2、查找系统中所有名称以 .docx 结尾的文件

  • 4、调用可执行程序

    • 4.1、调用系统自带的应用程序
    • 4.2、调用第三方应用程序

  • 5、系统优化案例

    • 5.1、删除桌面快捷方式小箭头
    • 5.2、删除多余右键菜单

  • 6、批处理 UI 效果

    • 5.1、功能选择界面
    • 5.2、进度条效果

  • 7、总结
1、批量修改文件名
  从我这些年使用 Windows 的经验来看,需要批量的修改文件名的时候还是蛮多的。要达到批量的修改文件名的效果,办法也是挺多的,最简单的方法是 Windows 自带的批量修改文件的功能,也可以到网上去下载批量改名工具来实现。
  当然,这两种方法我都不喜欢!因为 Windows 自带的改名功能会在文件名后附加“(1)、(2)、(3)……(N)”这种实际可能多余的后缀。而网上下载的那些小工具,往往被植入广告甚至病毒,而且也不一定好用,甚至根本就没用。
  早些年我经常用 Windows 自带的改名功能来批量修改图片名,可能有些朋友还不知道这个功能,在这儿我顺带说一下(假如要为 100 张风景图片改名):【选中】那 100 张图片,在任意一张照片上【右键】,然后选择【重命名】,【输入】新名字,然后【回车】。效果如何一测便知!
  本节将主要来介绍下如何通过批处理来批量修改文件名。可能你遇到的情况不一样,但思路是一致的,也就是要通过某个的方法来生成一批 ren 指定,然后将其保存到批处理文件中,双击执行即可。这里就来说说我是如何通过批处理来批量修改我下载的美剧视频文件名的。


  • 第一步:将全集视频集中到一个文件夹中,假如这个文件夹是“D:\Workspace”,启动 cmd 键入dir D:\Workspace /b > D:\Workspace\rens.bat。
  • 第二步:右键编辑 rens.bat,依次按 Ctrl+A、Ctrl+C 选中并复制所有文本,新建一个 Excel 文件,选中任意一个 Sheet 的 A1 单元格,按 Ctrl+V 将复制的文本拷贝到 Excel 中去。
  • 第三步:假如你想把这些视频文件命名为“美剧S01E××”,那么你只需在 B1 单元格中输入“美剧S01E01”,然后选中 B1 单元格右下角的点拖动到有文件名称的最后一行。
  • 第四步:在 C1 单元格中输入="ren """&A1&""" """&B1&"""",同样选择右下角的点拖动到有文件名称的最后一行。然后选中 C 列有值的单元格按 Ctrl+C,再到 rens.bat 文件中依次按 Ctrl+A、Ctrl+V、Ctrl+S。
  • 第五步:双击 rens.bat 文件图标……结果如你所想!
2、批量重启服务
  现如今开发一个 Web 项目往往会涉及很多后台技术,譬如你用 C# 开发,那么你的网站一般会部署到 IIS 上,网站后台你可能会写一个服务叫 AppService,服务端缓存数据你可能会存储到 Memcached 服务中。这样一来就已经有 3 个服务了,实际上往往需要更多的服务。
  在实际开发或测试的时候,我们经常会遇到服务挂掉或出现异常的情况,这时候就需要把服务恢复到初始状态了。那么多服务如果挨个手动重启当然是可以的,但这样做的话效率就太低了,这时候我们就可以通过批处理来实现批量重启服务了。
  就拿上面提到的 3 个服务来说,可以通过把如下脚本保存到批处理文件中,然后双击批处理文件来实现批量重启系统中所有需要重启的服务:
  

net stop AppService  
net stop memcached
  
iisreset
  
net start memcached
  
net start AppService
  

3、全盘搜索指定文件

3.1、全盘搜索名称为 mm.jpg 的文件,获取其全路径
  写法 1(for + dir + find):
  

@echo off  
title 正在搜索,请稍候...
  
echo 正在搜索,请稍候...
  
rem 设定文件名
  
set "filename=mm.jpg"
  
rem 遍历从 C 到 Z 之间的字母
  
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  rem 如果存在从 C:\ 到 Z:\ 之间的某个磁盘则继续
  if exist %%i:\ (
  rem /a-d 表示非目录,即所有的文件
  rem 2^>nul 表示屏蔽操作失败的回显,如果成功还是会显示
  rem | 是命令管道符,表示将前一个命令的执行结果输送到后一个命令
  dir /a-d /s /b %%i: 2^>nul | find "%filename%" >> files.txt
  )
  
)
  
rem 打开 files.txt 文件
  
start files.txt
  

  1>nul 表示屏蔽操作成功的回显,如果出错还是会显示,在命令的最后面加 1>nul 2>nul 表示同时屏蔽掉正确和错误的信息,这样就不会显示任何消息了。^ 是转义符,一般不需要加在 > 前面,但在 for 循环中使用就必须加上,否则会有语法错误。
  写法 2(for /f + dir):
  

@echo off  
title 正在搜索,请稍候...
  
echo 正在搜索,请稍候...
  
set "filename=mm.jpg"
  
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  if exist %%i:\ (
  rem "delims=" 表示取消默认分割,即不分割
  for /f "delims=" %%j in ('dir /a-d /s /b "%%i:\*%filename%" 2^>nul') do (
  rem "%%~nxj" 表示 for 循环中索引为 %%j 的文件名(含扩展名)
  if /i "%%~nxj" equ "%filename%" echo.%%j
  )
  )
  
)
  

  写法 3(pushd popd + for /r):
  

@echo off  
title 正在搜索,请稍候...
  
echo 正在搜索,请稍候...
  
set "filename=mm.jpg"
  
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  if exist %%i:\ (
  rem 改变当前目录到 %%i:\,这样就方便使用相对路径了
  pushd %%i:\
  for /r %%j in (*mm.jpg) do (
  if /i "%%~nxj" equ "%filename%" echo.%%j
  )
  popd
  )
  
)
  

  写法 4(for /f + where):
  

@echo off  
title 正在搜索,请稍候...
  
echo 正在搜索,请稍候...
  
set "filename=mm.jpg"
  
for %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  if exist %%i:\ (
  rem 此处的 where 为 Windows 自带的命令,单引号包裹表示封装命令
  for /f "delims=" %%j in ('where /r %%i: %filename% 2^>nul') do (
  if /i "%%~nxj" equ "mm.jpg" echo.%%j
  )
  )
  
)
  

  写法 5(for /f + wmic):
  

@echo off  
title 正在搜索,请稍候...
  
echo 正在搜索,请稍候...
  
set "filename=mm.jpg"
  
for %%i in (%filename%) do (
  rem 接收文件名,不含后缀
  set "nName=%%~ni"
  rem 接收文件后缀名
  set "xName=%%~xi"
  
)
  
rem 截取 xName 第 1 位之后的字符,即去掉后缀名前的点
  
set "xName=%xName:~1%"
  
for /f "skip=1 delims=" %%i in (
  rem wmic 即 Windows Management Instrumentation(Windows 管理工具)
  'wmic datafile where "filename='%nName%' and extension='%xName%'" get name'
  
) do echo.%%i
  

  第 2~5 种写法参考了:批处理(bat)实现全盘搜索指定文件获取其完整路径方法大全。

3.2、查找系统中所有名称以 .docx 结尾的文件
  写法 1:
  

@echo off  
title 正在搜索,请稍候...
  
echo 正在搜索,请稍候...
  
set drives=C D E F G H I J K L M N O P Q R S T U V W X Y Z
  
for %%i in (%drives%) do (
  if exist %%i:\ (
  dir /a-d /s /b %%i: 2^>nul | findstr ".doc$" >> files.txt
  )
  
)
  
start files.txt
  

  写法 2(比写法 1 效率高,但输出的每个文件名后面都会有很多空格):
  

@echo off  
title 正在搜索,请稍候...
  
echo 正在搜索,请稍候...
  
for /f "skip=1 delims=" %%i in (
  'wmic datafile where "extension='doc'" get name'
  
) do (echo %%i >> files.txt)
  
start files.txt
  

4、调用可执行程序

4.1、调用系统自带的应用程序
  在 Windows 命令行工具(cmd.exe 和 powershell.exe)中可以直接调用应用程序文件。譬如以 exe 为后缀的可执行文件,以 com 为后缀的命令文件,以 bat 或 cmd 为后缀的批处理文件等都能被命令行工具调用,而且只需在命令提示符后键入基本文件名后回车即可,无需输入后缀名(输入也可以)。
  在 Windows 操作系统中有很多实用的可执行程序,譬如记事本、计算器、画板等,这些工具如果通过开始菜单来找到并打开的话,显然是很不方便的。但在开始菜单的“搜索程序和文件”或命令行中启动这些程序却是方便又快捷的,譬如在命令提示符后键入 calc 后按回车即可启动计算器。
  常见 Windows 自带可执行程序一览表(其中 .msc 后缀不能省略)

序号
启动命令
应用程序
备注
1
cmd.exe
CMD
2
powershell.exe
Power Shell
3
notepad.exe
记事本
4
write.exe
写字板
开始中可用 wordpad.exe
5
calc.exe
计算器
6
soundrecorder.exe
录音机
7
osk.exe
屏幕键盘
8
magnify.exe
放大镜
9
mstsc.exe
远程桌面连接
10
compmgmt.msc
计算机管理
11
regedit.exe
注册表编辑器
12
gpedit.msc
本地组策略编辑器
13
control.exe
控制面板
14
lusrmgr.msc
本地用户和组
15
explorer.exe
资源管理器
16
taskmgr.exe
Windows 任务管理器
17
services.msc
服务
18
taskschd.msc
任务计划程序
19
diskmgmt.msc
磁盘管理
20
devmgmt.msc
设备管理器
21
wf.msc
高级安全 Windows 防火墙
22
inetmgr.exe
Internet 信息服务(IIS)管理器
需打开功能
23
iisreset.exe
重启IIS服务
34
at.exe
指定在特定时间运行命名或程序
25
eventvwr.msc
事件查看器
26
winver.exe
关于 Windows
27
hostname.exe
显示主机名
28
msconfig.exe
系统配置
29
perfmon.msc
性能检测器
30
chkdsk.exe
Chkdsk 磁盘检查
31
cleanmgr.exe
磁盘清理
32
dxdiag.exe
DirectX 诊断工具
33
fsmgmt.msc
共享文件夹
34
secpol.msc
本地安全策略
35
systeminfo.exe
显示本机系统信息
36
eudcedit.exe
造字程序
37
charmap.exe
字符映射表
38
nslookup.exe
IP侦测器,退出用exit
39
uac
用户账户控制设置
40
sn
记录步骤以再现问题
41
mspaint.exe
画板
默认仅开始中可用
42
wmplayer.exe
Windows Media Player
43
iexplore.exe
IE浏览器,默认需添加环境变量
默认仅开始中可用
44
cliconfg.exe
SQL Server 客户端网络实用工具
默认仅开始中可用
4.2、调用第三方应用程序
  第三方软件如果你知道它的启动程序文件名的话,也可以通过键入命令的方式来启动。譬如 Microsoft Office Excel 可以通过 excel 来启动,Visual Studio 可以通过 devenv 来启动,腾讯通可以通过 rtx 来启动。
  某些时候也会有些例外,譬如 Microsoft Office Word 的启动程序是 winword.exe,但你不仅可以通过 winword 来启动,也可以通过 word 来启动,而微信的启动程序是 WeChat.exe,但你却只能通过“微信”来启动,不能通过 wechat 来启动。
  部分第三方应用程序命令列表

序号
启动命令
应用程序
备注
1
winword.exe
Microsoft Office Word
也可用 word
2
excel.exe
Microsoft Office Excel
3
powerpnt.exe
Microsoft Office PowerPoint
4
msaccess.exe
Microsoft Office Access
5
visio.exe
Microsoft Office Visio
6
devenv.exe
最后安装的那个版本的 VS
7
code.cmd
Visual Studio Code
8
notepad++.exe
Notepad++
9
ssms.exe
SQL Server 2008
10
sqlwb.exe
SQL Server 2005
11
isqlw.exe
SQL Server 2000
12
plsqldev.exe
PLSQL Developer
默认仅开始中可用
13
chrome.exe
Google Chrome
默认仅开始中可用  上面两个列表中的大部分应用程序对于某些特定群体而言并不常用,这就意味着很难记住那么多命令。但如果搜集这些命令仅仅是为了打开相应的软件那就太初级了,我们完全可以通过这些命令再结合其它命令来解决实际问题。
  曾有一段时间,我工作时需要用到多台电脑,每台电脑上都要安装 PLSQL Developer,安装完之后还得逐个电脑配置环境变量 NLS_LANG,以确保每台电脑上的 SQL 错误提示都是中文。如果不配置环境变量的话,有时候看到数据库中的数据都是乱码(可能跟我用的绿色版有关),但总是全都配置一遍着实有些麻烦。
  突然某一天,我发现了一个很好的解决方案,就是把下面的脚本保存到批处理文件中,然后把这个批处理放到 PLSQL Developer 主目录中,再通过批处理来启动 PLSQL Developer。事实上第一次这么干的时候,我还不知道这段脚本的具体含义,但实验结果告诉我——它行得通!
  

set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK  
start plsqldev.exe
  

  其实只要你肯想,还可以玩出很多有意思的花样,譬如在执行耗时比较久的命令时,可以通过如下命令给批处理程序加个“背景音乐”:
  

start /b /low /min wmplayer.exe http://up.haoduoge.com:82/mp3/2017-06-29/1498739481.mp3  

5、系统优化案例

5.1、删除桌面快捷方式小箭头
  Win7 中必须以管理员身份运行,否则无效
  

@echo off  
color 2
  
reg delete HKCR\lnkfile /v IsShortcut /f
  
reg delete HKCR\piffile /v IsShortcut /f
  
reg delete HKCR\InternetShortcut /v IsShortcut /f
  
taskkill /f /im explorer.exe && explorer
  

5.2、删除多余右键菜单
  Win7 的右键菜单本来就比较多,许多软件还会再给右键添加菜单,当右键菜单过多时会比较难找到对应的菜单,其中有些右键菜单几乎从来都用不着,譬如最恶心(常见)的“NVIDIA 控制面板”等菜单纯属多余。
  

@echo off  
color 2
  
regsvr32 /u /s igfxpph.dll
  
reg delete HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers /f
  
reg add HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\New /ve /d {D969A300-E7FF-11d0-A93B-00A0C90F2719}
  

  注意:上述批处理脚本会把所有非系统右键菜单都删除(最近发现了一个例外 Visual Studio Code 的右键菜单不会被删除)。其实上述脚本背后的原理很简单,本质上就是删除注册表,把代表右键菜单的项(HKEY_CLASSES_ROOT\Directory\background\shellex\ContextMenuHandlers)下的所有子项都删除,只保留 New 那一项即可,对应的注册表示意图如下:
  
DSC0000.png

6、批处理 UI 效果

6.1、功能选择界面
  无论是什么程序,一个好的 UI 都是必不可少的,批处理也不例外。如下代码是一个简单的功能选择界面:
  

@echo off  
title 功能选择界面 by hanzz
  
color 1A
  
echo.
  
echo               ==================================
  
echo               请选择要进行的操作,然后使劲按回车
  
echo               ==================================
  
echo.
  
echo               1.系统工具,激活本机,检测大文件
  
echo.
  
echo               2.网络异常修复工具,自定义屏蔽网站
  
echo.
  
echo               3.清理系统垃圾
  
echo.
  
echo               Q.退出
  
echo.
  
:case
  
set /p choice=请选择:
  
IF NOT "%choice%"=="" SET choice=%choice:~0,1%
  
if /i "%choice%"=="1" goto sys
  
if /i "%choice%"=="2" goto net
  
if /i "%choice%"=="3" goto clear
  
if /i "%choice%"=="Q" goto quit
  
echo 选择无效,请重新选择
  
goto case
  
:sys
  
echo 请选择了系统工具
  
goto case
  
:net
  
echo 您选择了网络异常修复
  
goto case
  
:clear
  
echo 您选择了清理系统垃圾
  
goto case
  
:quit
  
quit
  

6.2、进度条效果
  如下代码是一个有些丑陋的进度条:
  

@echo off  
mode con cols=100 lines=15 & color 1A
  
echo.
  
echo  进度条加载中. . .
  
echo.
  
echo  ┌──────────────────────────────────────┐
  
set /p a= <nul
  
for /l %%i in (1 1 27) do set /p a= ■<nul & ping /n 1 127.0.0.1>nul
  
echo 100%%
  
echo  └──────────────────────────────────────┘
  
pause
  

  本人在网上看到一个效果还可以的进度条,链接:批处理进度条。

7、总结
  我相信通过本文的几个案例已经足够能让你了解到 Windows 批处理的强大和魅力所在。我曾在网上看到有大神用批处理做推箱子、贪吃蛇、俄罗斯方块、五子棋、RPG、杀毒、彩票走势图的,如果你有兴趣也可以到网上去搜索相关案例再看看。下面列举的是几个比较实用或有意思的案例的参考链接:


  • 批量导出、导入Oracle数据库
  • 批处理将文件重命名为文件修改时间
  • 改进版的垃圾清除的批处理
  • 贝塞尔曲线对称变幻艺术
  本文链接:http://www.cnblogs.com/hanzongze/p/cmd-batchs.html
  
版权声明:本文为博客园博主 韩宗泽 原创,作者保留署名权!欢迎通过转载、演绎或其它传播方式来使用本文,但必须在明显位置给出作者署名和本文链接!个人博客,能力有限,若有不当之处,敬请批评指正,谢谢!


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421842-1-1.html 上篇帖子: windows下安装并启动hadoop2.7.2 下篇帖子: windows下nginx的安装及使用方法入门
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表