探索Windows命令行系列(6):活用批处理解决实际问题

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 那一项即可,对应的注册表示意图如下:
cmd05

6、批处理 UI 效果

6.1、功能选择界面

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

@echo off
title 功能选择界面
color 1A
echo.
echo               ==================================
echo               请选择要进行的操作,然后使劲按回车
echo               ==================================
echo.
echo               1.系统工具,激活本机,检测大文件
echo.
echo               2.网络异常修复工具,自定义屏蔽网站
echo.
echo               3.清理系统垃圾
echo.
echo               Q.退出
echo.
:case
set /p choice=请选择:
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、杀毒、彩票走势图的,如果你有兴趣也可以到网上去搜索相关案例再看看。下面列举的是几个比较实用或有意思的案例的参考链接:

本文链接http://www.cnblogs.com/hanzongze/p/cmd-batchs.html
版权声明:本文为博客园博主 韩宗泽 原创,作者保留署名权!欢迎通过转载、演绎或其它传播方式来使用本文,但必须在明显位置给出作者署名和本文链接!个人博客,能力有限,若有不当之处,敬请批评指正,谢谢!

posted @ 2017-06-30 11:00  韩宗泽  阅读(2554)  评论(6编辑  收藏  举报
回到顶部