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_USEREnvironment est" /ve 1>nul 2>nul
if %ERRORLEVEL% EQU 0 (REG DELETE "HKEY_CURRENT_USEREnvironment est" /F)
讲解
-
REG QUERY 用于查询注册表项或值。配合 %ERRORLEVEL% 使用即可实现检测注册表项是否存在的效果。
-
如果需要检测具体值应像下面演示的这样:
REG QUERY "HKEY_CURRENT_USEREnvironment" /v "Path" 1>nul 2>nul
if %ERRORLEVEL% EQU 0 (REG DELETE "HKEY_CURRENT_USEREnvironment" /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_USEREnvironment" /v "NAME" /t REG_SZ /d "KEY" /F
讲解
-
命令表示在“HKEY_CURRENT_USEREnvironment”项下添加一个键值为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_USEREnvironment |
系统环境变量 | HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerEnvironment |