批处理(Batch)使用记录

定义

维基百科中批处理的解释是:

批处理文件(英语:Batch file),又称批次档,在DOS、OS/2、微软视窗系统中,是一种用来当成脚本语言运作程序的文件。它本身是文本文件,其中包含了一系列让具备命令行界面的解释器读取并执行的指令。它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的解释器(通常是COMMAND.COM或者CMD.EXE)解释运行。它相当于是类Unix系统下的Shell script

简单来说 批处理就是包含一行或多行的"可执行"文本文件(后缀通常是 .bat, .cmd), 本文记录了笔者在使用批处理过程出现的 BUG 语法错误, 以示警醒

语法

批处理的语法, 着实让人… 算了, 这是不看文档的锅…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
## 此为注释, 脚本不执行
@rem 此为注释命令

## echo前面加 @ 表示此命令不显示在窗口中
@echo mailto:solitude@hraulein.com

## 表示往下执行的命令都不显示 >> 命令若有输出会显示, 只是不显示执行的命令行
@echo off

## 定义变量
set FileName=public.zip

## 引用变量
echo %FileName%

## 跨盘切换路径
cd /d "E:\Developer\PowerShell"

## 当前工作路径
echo %cd%

## 脚本文件路径
echo %~dp0

## 输出空行
echo.

## 脚本间相互调用 (call)
call hexo g

## 将脚本的完整输出信息保存, 在另一个脚本用 call 调用
call RapidDeployment.bat >> batch.log

特别提醒: ## 并不是批处理的注释符, 批处理注释符为 :: 或使用 @REM

纠错

适应了其他编程语言, 再去接触批处理的语法格式. 难免会出现一些不可避免的语法错误

## 错误的定义: 命令中有空格, 可能会导致引用错误

set FileName = public.zip  ×
set FileName=public.zip    √

## 截取时间: %Date% %Time%

## 当时间为"个位数"的时候, 截取的值为 ' 0' 而不是 '00' , 可能会导致引用变量的该行命令语法错误

参数说明:

  • %Date% %Time%: 当前系统日期&&时间 (根据时区语言格式设置不同, 输出也有所不同)
  • %date:~8,2: 在输出的结果, 从第8位开始, 取2位
  • %time:~0.2: 在输出的结果, 从第0位开始, 取2位
  • %datetime: =0\%: 将变量 datetime 中的 ' ' 替换为 '0'
  • " # " 开头为执行命令
  • " > " 开头为输出结果
# echo %Date% %Time%
> 20/03/2022 00:37:10.68

# set datetime=%date:~8,2%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%%time:~6,2%
# echo %datetime%
> 20220320_ 03710
# move public.zip public_%datetime%.zip
> The syntax of the command is incorrect.

# set datetime=%date:~8,2%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%%time:~6,2%
# set reformatDate=%datetime: =0%
# echo %reformatDate%
> 20220320_003710
# move public.zip public_%reformatDate%.zip
>       1 file(s) moved.

在重新格式化 datetime 后, 成功执行了重命名 .zip 文件的操作

实践

附上两个批处理脚本(.bat)文件内容, 仅供学习参考

如使用 记事本 新建 .bat 文件, 请设置文本编码为 ANSI , 用 Visual Studio Code 则建议设置编码格式为 GBK

测试目录结构

.\BatchTest
  ├─ logs
  │   └─ ...
  ├─ public
  │   └─ ...
  ├─ _old_public
  │   └─ ...
  ├─ CallRDeployment.bat
  ├─ public.zip
  └─ RapidDeployment.bat

RapidDeployment.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@echo off
echo Rapid Deployment by Ali.
echo Email: solitude@hraulein.com
cd /d %~dp0

## bat脚本中如果存在批处理文件,必须使用call进行调用
call hexo g

SET ZipFile=public.zip
## 系统时区语言不同会导致date,time的格式不同, 请根据实际情况进行相应修改
SET NowDateTime=%date:~8,2%%date:~3,2%%date:~0,2%_%time:~0,2%%time:~3,2%%time:~6,2%
## 将获取的时间中的空格替换为0
SET RenameZip="public_%NowDateTime: =0%.zip"
SET OldPublic=_old_public

if exist %ZipFile% (
if not exist %OldPublic% (
mkdir %OldPublic%
)
move %ZipFile% .\%OldPublic%\%RenameZip%
)

## 7-Zip压缩文件夹命令行
"D:\7-Zip\7z.exe" a public.zip ".\public\*"

## 使用scp命令传输文件到虚拟机中
scp -i ".\iZw6zss98vbm7akzr3j8jtZ.pem" public.zip admin@127.0.0.1:/home/

echo ================== The EndTime is %Date% %Time% ==================

CallRDeployment.bat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## 调用 RapidDeployment.bat , 并输出日志
@echo off
echo Call Rapid Deployment by Ali.
echo Email: solitude@hraulein.com

cd /d %~dp0
SET LogFiles=RapidDeployment.log
SET LogPaths=logs
SET LogFilePath=%~dp0%LogPaths%\%LogFiles%

if not exist %LogPaths% (
mkdir %LogPaths%
)

call RapidDeployment.bat >> %LogFilePath%

特别提醒: ## 并不是批处理的注释符, 批处理注释符为 :: 或使用 @REM


题外

Windows 自定义快速启动 (运行) 命令

运行

测试环境目录 (E:\BatchTest)

.\BatchTest
├─ CallRDeployment.bat
├─ Dual WeChat.bat
├─ RapidDeployment.bat
└─ ...

打开控制面板, 搜索 环境变量, 将 E:\BatchTest 添加到 系统环境变量Path 项目下 (图略)

再次键入 Win + R 唤出 运行 窗口, 键入 CallRDeployment"Dual WeChat"RapidDeployment

即可实现自定义 快速启动 CMD命令, 文件名 为自定义CMD命令, 自定义命令在CMD/PowerShell窗口同样适用

* 请根据实际情况将存放脚本文件的目录路径添加到 Path