bat学习

概念

  • 批处理的本质,是一堆DOS和cmd命令按一定顺序排列而形成的集合。
  • 熟悉DOS语法,然后按照正确的顺序来进行指令的运行。

系统教程

  • 使用/?查看if的功能,使用与很多指令,%似乎不行。
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
if /?
pause

--------------------------------------------

C:\Users\Administrator\Desktop>
执行批处理程序中的条件处理。

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

NOT 指定只有条件为 false 的情况下,Windows 才
应该执行该命令。

ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
指定数字的退出代码,指定条件为 true。

string1==string2 如果指定的文字字符串匹配,指定条件为 true。

EXIST filename 如果指定的文件名存在,指定条件为 true。

command 如果符合条件,指定要执行的命令。如果指定的
条件为 FALSE,命令后可跟 ELSE 命令,该命令将
在 ELSE 关键字之后执行该命令。

ELSE 子句必须出现在同一行上的 IF 之后。例如:

IF EXIST filename. (
请按任意键继续. . .

从一个demo中学习

  • 这个demo的作用是用来更新游戏客户端的。一般来说我们的端游客户端会有一个launcher来启动真正的游戏,它还要负责来更新游戏。同时,它还要更新自己,以前WOW中的做法是有个专门的update.exe来做更新(不过现在是靠battle.net来更新了),我觉得bat文件一样可以做,因此写了这个demo。下面代码中TL代表launcher,TC代码client。
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
33
34
@echo on
cls

:: 当前程序所在目录
set LocalPath=%~dp0
:: TL更新包完全路径名,不带后缀,同时也是解压缩后的文件夹名称
set TLZipFile=%~dp0TLUpgradeData\TL_%1
:: TL更新包解压路径
set TLDecompressPath=%~dp0TLUpgradeData\

echo 执行更新,请稍后...

echo ----1.关闭客户端进程----
tasklist /nh|find /i "TL.exe"
if ERRORLEVEL 1 (echo TL客户端进程已经结束) else (taskkill /f /im TL.exe)
tasklist /nh|find /i "TC.exe"
if ERRORLEVEL 1 (echo TC客户端进程已经结束) else (taskkill /f /im TC.exe)

echo ----2.开始解压缩安装包----
if exist %TLZipFile%.zip %LocalPath%7z x %TLZipFile%.zip -o%TLDecompressPath% -aoa

echo ----3.开始复制文件----
xcopy %TLZipFile% %LocalPath% /e /f /k /y
:: xcopy switch说明:
:: /E 复制目录和子目录,包括空目录。
:: /F 复制时显示完整的源文件名和目标文件名。
:: /K 复制属性。一般的 Xcopy 会重置只读属性。
:: /Y 取消提示以确认要覆盖

echo ----4.删除临时文件----
del %TLZipFile%.zip
rmdir %TLZipFile% /s /q
:: 删除当文件夹和里面的所有文件,/s 表示包含子文件夹,/q 表示不需要确实提示
pause

@

  • 它的作用是让执行窗口中不显示它后面这一行的命令本身。行首有了它的话,这一行的命令就不显示了。首行的@echo off中,@的作用就是让脚本在执行时不显示后面的echo off部分。

:: -双冒号

  • 类似注释符号

>>>

  • >指示将内容写入某个文件
  • >>的作用,和>的相同,区别是把结果追加到前一行得出的结果的后面,类似写文件时的append。

echo的三个用法

  • 命令显示与否的开关,有off和on两个选项。设置为off后,后续所有的命令都不会显示命令本身,只显示命令的结果。
  • 类似于print,用于输出信息。
  • 可以直接编辑文本文件。

pause

  • 就是字面意思

:goto

  • goto用于与其它语言是一样的,就是跳转到一个指定的标签
  • :是定义一个标签

if

1
2
3
4
5
6
7
8
9
10
11
12
@echo off

if "%1" == "1" goto goto1
if "%1" == "2" goto goto2

:goto1
echo 参数是goto1

:goto2
echo 参数是goto2
pause
exit
  • 就是条件判断,只不过跟着不同的命令产生不同的功能
  • if exist判定存在
  • 结果判断
  • if not 否定判定

变量

  • 使用set来进行变量设置,set还有几个switch。当变量的来源是输入内容时用set /p
  • set variable=value注意这个语句中等号前后没有空格,我发现有空格的话变量赋值有问题。
  • 使用变量时用%variable%的形式,即两个百分号夹住变量名。
  • 与传统的编程语言不同,bat中变量不能连接使用,比如下面这样是不行的。
1
2
set a=1
set b=%a%2

外部参数

  • %(0-9)来表示参数,其中%0代表自己,demo中只有一个参数是当前最新的版本号,用的是%1。
  • bat中参数有很多用法,具体不描述了。

其它的cmd命令

  • demo中还是有tasklist、taskkill、del、rmdir这样的命令,这些就不一一解释了。其实这些全部都是cmd的命令,这样验证了开始时说的,其实bat就是顺序执行一些dos和cmd命令。

资源

# 杂记
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×