HashSF 程序編寫總結
前言
HashSF 是我用 Batch 寫的較為完整(符合程序設計)的一個項目。雖然功能簡單,但模擬一個完整的程序流程並不容易。因為 Batch 語法和正規的C/CPP 語法相比顯得十分簡陋,所以編寫時有很多在 C/CPP 中可以很容易就實現的功能,在 Batch 中卻顯得十分繁瑣。但 Batch 並不是完全沒有優勢,在文件處理、注冊表操作和用戶賬戶操作等一些調用系統API的操作上,批處理的簡單程度不是任何一門語言可以媲美的!畢竟,這一切在 Batch 中只需要幾句簡單的 CMD 命令就可以完成了!
所以,我認為 Batch 被用來輔助程序的開發將是一個事半功倍的優秀選擇!而且,Batch 是兼容 Windows 和 Linux 系統的。但是,值得注意的是:由於 Windows 操作系統會有一些自己獨有的 CMD 命令,所以在 Windows 平台編寫 Batch 程序時需要注意 Windows 平台特有的那些命令,這些命令是無法被 Linux 兼容的!
知識點總結索引
知識點總結
遍歷文件內容
源代碼
for /f "tokens=*" %%i in (demo.txt) do (echo %%i)
講解
-
%i 是 For循環語句 中的變量,相當於 CPP 中 For循環語句中的 (int) i。
-
tokens=* 表示提取每一行的每一段內容,默認以空格作為分隔符。如果將 “*” 換成 “1” 即表示提取每一行的第一段內容(注意:在 Batch 中用此語句讀取文件內容是按照行來決定的,一次讀取一行內容)。如果需要,可以使用 delims=XXX 來指定分隔符。詳情請使用
FOR /?命令查看。 -
demo.txt 表示需要提取內容的文件,這里也可以換成相對路徑 .\demo.txt。需注意:不能使用雙引號是因為雙引號內的文字會被當成字符串處理,而不是文件路徑;也不能使用單引號是因為單引號內的文字會被當成命令處理。
E.G
-
源代碼:

-
執行結果:

利用echo改變局部區域的字體顏色及背景色
源代碼
echo [36mDEMO[37m
講解
-
[ 的完整用法應該是 [(40 ~ 47);(30 ~ 37);(0 ~ 1)m 。
-
(40~47)表示背景色,可省略;
-
(30~37)表示字體顏色;
-
(0~1)表示字體顏色是否高亮顯示(淺色),可省略。
-
-
顏色參考表:
| 值 | 高亮 | 顏色 |
|---|---|---|
| 30/40 | 0 | 黑色 |
| 30/40 | 1 | 灰色 |
| 31/41 | 0 | 紅色 |
| 31/41 | 1 | 淺紅色 |
| 32/42 | 0 | 綠色 |
| 32/42 | 1 | 淺綠色 |
| 33/43 | 0 | 黃色 |
| 33/43 | 1 | 淺黃色 |
| 34/44 | 0 | 藍色 |
| 34/44 | 1 | 淺藍色 |
| 35/45 | 0 | 紫色 |
| 35/45 | 1 | 淺紫色 |
| 36/46 | 0 | 青色 |
| 36/46 | 1 | 淺青色 |
| 37/47 | 0 | 灰白色 |
| 37/47 | 1 | 亮白色 |
E.G
-
源代碼:

-
執行結果:

關於程序的結束與退出
源代碼
goto:eof
exit /b 0
講解
-
goto:eof 表示程序運行結束,但不關閉窗口。
-
exit /b 0 表示強制結束程序並退出窗口,同時返回值 0 。這個值將被 %ERRORLEVEL% 接收。
自定義“pause”的輸出文字
源代碼
set /p output=請自定義這段文字...
講解
-
巧用 set /p 實現自定義 pause 輸出文字的效果。
-
這個 output 變量可重復使用。建議專門設幾個變量用於不同代碼塊下的暫停(增強程序的可讀性,也可以被用來檢測程序已經執行到哪個位置)。
E.G
-
源代碼:

-
執行結果:

判斷變量是否為空
源代碼
if defined output () else ()
講解
-
if defined 判斷變量是否為空是我推薦的方法,其它方法都有一定的弊端。
-
結合上一知識點,可以聯合使用:
set /p output=這里寫提示信息...
if defined output set output=
這樣可以完美實現暫停效果,而且變形后可以用來設置“返回上一步”之類的的操作。例如,指定輸入“B”返回上一步(用 if 語句判斷)。
E.G
-
源代碼:

-
執行結果:

判斷注冊表項是否存在
源代碼
REG QUERY "HKEY_CURRENT_USER\Environment\test" /ve 1>nul 2>nul
if %ERRORLEVEL% EQU 0 (REG DELETE "HKEY_CURRENT_USER\Environment\test" /F)
講解
-
REG QUERY 用於查詢注冊表項或值。配合 %ERRORLEVEL% 使用即可實現檢測注冊表項是否存在的效果。
-
如果需要檢測具體值應像下面演示的這樣:
REG QUERY "HKEY_CURRENT_USER\Environment" /v "Path" 1>nul 2>nul
if %ERRORLEVEL% EQU 0 (REG DELETE "HKEY_CURRENT_USER\Environment" /v "Path" /F)
具體用法請使用命令 REG QUERY /? 進行查看。
窗口修飾
源代碼
::改變窗口大小
mode con cols=56 lines=18
::改變窗口標題
title HashSF哈希碼校驗工具@SeaFever
::改變窗口顏色
color 70
講解
-
cols= 后跟窗口的寬度, lines= 后跟窗口的高度。兩者均以一個單位字符的寬高作為單位寬高。
-
title 直接跟文字就好了,如果顯示中文亂碼請將文件以 ANSI 編碼模式保存。
-
color 第一個字符(7)表示背景色,第二個字符(0)表示前景色。不同的字符代表不同的顏色,詳請請看下表:
| 字符 | 顏色 |
|---|---|
| 0 | 黑色 |
| 1 | 藍色 |
| 2 | 綠色 |
| 3 | 淺綠色 |
| 4 | 紅色 |
| 5 | 紫色 |
| 6 | 黃色 |
| 7 | 白色 |
| 8 | 灰色 |
| 9 | 淡藍色 |
| A | 淡綠色 |
| B | 淡淺綠色 |
| C | 淡紅色 |
| D | 淡紫色 |
| E | 淡黃色 |
| F | 亮白色 |
E.G
-
源代碼:

-
執行結果:
自己復制代碼試一下吧,壓制出來的gif圖還是太大,上傳不了!
@ECHO OFF
title DEMO演示
for %%a in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
for %%b in (0 1 2 3 4 5 6 7 8 9 A B C D E F) do (
cls
echo color=%%a%%b ███████████████████████████████████████████████████████
for /L %%i in (0 1 27) do (echo ████████████████████████████████████████████████████████████)
color %%a%%b
ping 127.0.0.1 -n 1 1>nul 2>nul
)
)
pause
添加環境變量
源代碼
REG ADD "HKEY_CURRENT_USER\Environment" /v "NAME" /t REG_SZ /d "KEY" /F
講解
-
命令表示在“HKEY_CURRENT_USER\Environment”項下添加一個鍵值為KEY、名為NAME的REG_SZ類型(字符串類型)值。
-
/F 代表強制。詳細使用方法請使用命令
REG ADD /?查看。 -
這里是直接操作注冊表,環境變量不會立刻生效,需要重啟電腦。但可以用
taskkill /im explorer.exe /f 1>NUL 2>NUL
start explorer.exe 1>NUL 2>NUL
命令讓其直接生效。
- 這里添加的是用戶環境變量,所以使用 setx 命令會更方便(setx只能添加用戶環境變量)地實現。下面的表格給出系統環境變量的注冊表位置:
| 環境變量類型 | 注冊表位置 |
|---|---|
| 用戶環境變量 | HKEY_CURRENT_USER\Environment |
| 系統環境變量 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment |
