探索Windows命令行系列(6):活用批處理解決實際問題

来源:http://www.cnblogs.com/hanzongze/archive/2017/06/30/cmd-batchs.html
-Advertisement-
Play Games

" 1、批量修改文件名 " " 2、批量重啟服務 " " 3、全盤搜索指定文件 " "3.1、全盤搜索名稱為 mm.jpg 的文件,獲取其全路徑" "3.2、查找系統中所有名稱以 .docx 結尾的文件" " 4、調用可執行程式 " "4.1、調用系統自帶的應用程式" "4.2、調用第三方應用程式" ...


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 功能選擇界面 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、殺毒、彩票走勢圖的,如果你有興趣也可以到網上去搜索相關案例再看看。下麵列舉的是幾個比較實用或有意思的案例的參考鏈接:

本文鏈接http://www.cnblogs.com/hanzongze/p/cmd-batchs.html
版權聲明:本文為博客園博主 韓宗澤 原創,作者保留署名權!歡迎通過轉載、演繹或其它傳播方式來使用本文,但必須在明顯位置給出作者署名和本文鏈接!個人博客,能力有限,若有不當之處,敬請批評指正,謝謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • openssl dhparam用於生成和管理dh文件。dh(Diffie-Hellman)是著名的密鑰交換協議,或稱為密鑰協商協議,它可以保證通信雙方安全地交換密鑰。但註意,它不是加密演算法,所以不提供加密功能,僅僅只是保護密鑰交換的過程。在openvpn中就使用了該交換協議。 openssl dhp ...
  • 電腦組成、linux發行版、linux哲學思想、基本命令、目錄結構 ...
  • 現在有這麼一個場景:我是一個很忙的大老闆,我有100個手機,手機來信息了,我的秘書就會告訴我“老闆,你的手機來信息了。”我很生氣,我的秘書就是這樣子,每次手機來信息就只告訴我來信息了,老闆趕緊去看。但是她從來不把話說清楚:到底是哪個手機來信息啊!我可有100個手機啊!於是,我只能一個一個手機去查看, ...
  • 管理員許可權運行“命令提示符” 輸入:netsh winsock reset 然後重啟電腦即可 ...
  • 本文目錄: 14.1 按下電源和bios階段 14.2 MBR和各種bootloader階段 14.2.1 boot loader 14.2.2 分區表 14.2.3 採用VBR/EBR方式引導操作系統 14.3 grub階段 14.3.1 使用grub2時的啟動過程 14.3.2 使用傳統grub ...
  • 1、故障現象 CentOS 6.5重啟後顯示grub loading stage2,屏幕顯示一直停在這個地方。 2、故障原因 系統啟動找不到引導盤 3、解決辦法 BMC中通過虛擬光碟機掛載同一系統鏡像,重新啟動 選擇rescue installed system 進入Shell腳本輸入界面後輸入命令 ...
  • unix是一個多用戶多任務的操作系統。早期電腦昂貴,所以當時使用便宜的設備連接到電腦上(當時還沒有鍵盤和顯示器,使用紙帶和卡片來輸入輸出)來使用操作系統,這個便宜的設備就是終端,也可以認為終端是一種控制台。所以可以認為電腦本身是console終端,便宜的連接設備是物理終端pty。 Linux是類un ...
  • vmware12上安裝的CentOs6.8,最終實現物理機上的windows10能正常訪問CentOs上的FTP伺服器。 一、查看是否安裝有ftp相關的安裝包。 # rpm -qa | grep vsftpd //ftp的安裝包就是vsftpd 查看到我的系統中沒有安裝相關的包,所以先把安裝包裝上。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...