今天想利用 BAT 档来完成 档案的复制工作,

像是,定期备份桌面的档案之类的阿~

按下去就自动跑好多棒啊!

 

制作批次档其实不难,1. 打在 txt 里,2. 另存成 .bat 档,就完成了。

麻烦是麻烦在语法不知道如何使用阿!! XD

于是就查了查 DOS 批次档语法~


 

解释一下:

BAT 是 Batch 的简写,因此 Batch Language 就是批次档所使用的语法喔!

DOS 是 Microsoft 的命令提示字元 (cmd),也就是背景一团黑的那个啦XP

换句话说,这边的指令只适用 Windows 喔 MacOS 的 terminal 指令是不一样的~

以下直接以实例来讲解,讲解部分也很精简,自己试过揣摩看看应该就能理解啦~

 

范例1:

@ECHO OFF

CD C:\Program Files (x86)\Google\Chrome

PAUSE

REM 复制到D:\底下~~~

COPY  *.txt  D:\David\备份BA~1\电脑\Chrome

ECHO finish

 

第一行打 "ECHO OFF",这样一来之后的命令都不会显示,改成 "ECHO ON" 的话,每行输入的命令就都会出现在萤幕上~

第二行 CD <路径> 就是前往那个路径,这是基本的 DOS 语法(不知道见下面)

第三行 PAUSE 会暂停,cmd 视窗就会停住等你按任意键继续

第四行 REM 是注解用的 (remark),DOS 会略过此行

第五行 COPY  *.txt  <路径>,是复制所有 txt 结尾的档案,到路径目标资料夹那里( *是万用字元,也是基本 DOS 语法喔xD)

第六行 ECHO finish,会在萤幕上显示 ECHO 后面的字串,所以就会显示 "finish"

 

第五行注意:

       COPY  *.txt   D:\David\备份BA~1\电脑\Chrome

它的路径原本是 " D:\小David\备份 Backups\电脑\Chrome "

但是因为 "备份 Backups" 这个档名里面含有空格,DOS 无法接受,所以需要转换成 8.3 format,

转换方法是在某个目录底下打 "dir/x",就会以 8.3 的格式列出目录底下的档名了~

 

 


常用 DOS 语法:http://goo.gl/M6cbcQ

                万用字元 * 的使用,是在大约第五行的地方~ 第二页还有 ren (重新命名) 的语法喔有兴趣可以看看~

BAT 批次档语法:http://33tsai.blogspot.tw/2008/04/bat.html

               上面是第一页,第二页在这边:http://33tsai.blogspot.tw/2008/04/bat_21.html ,此篇主要都是参考这两篇的喔~

档名转换成 DOS 8.3 格式:http://goo.gl/oEsDCh 

               里面就有提到 "dir/x" 的方法~


 

 

范例2:

@ECHO OFF

IF "%1"=="A" ECHO Apple

IF "%1"=="B" ECHO Boy

输入:C:\sp.bat  A

输出:Apple

 

假设这个程式叫做 "sp",并且放在 C:\ 底下,

那么,当我们在cmd 输入 "C:\sp.bat  A" 时,参数 "A" 就会被读到 %1 里面,于是程式最后就印出了 "Apple"

补充一点:最多可以传送九个参数喔,%1 ~ %9

 

范例3:

@ECHO OFF 

CD D:\David\备份BA~1\电脑\Chrome\

IF EXIST %1 GOTO PrintFile

GOTO FileNotExist

:PrintFile

    TYPE %1

    GOTO End

:FileNotExist

    ECHO File Not Exist!

    GOTO End

:End

输入:C:\test.bat  list.txt

输出:< list.txt  档案里的内容 >

 

假设这个程式叫做 "test.bat",并且 "D:\David\备份BA~1\电脑\Chrome\" 底下有放一个叫 "list.txt" 的档案,

那么当输入上面那一串内容时,就会把 txt 里面内容都印出来。而若找不到此一档案名称,就会印出 "File Not Exist!"

补充一点:BAT 程式里,所有的 "%1" 都是会被输入参数直接取代掉的喔~

 

第三行,IF EXIST <路径> <档名> <动作> ;路径如果是同个资料夹就可以忽略;其实也可以改成 IF NOT EXIST <.....>

第三行,GOTO PrintFile,效果是直接跳到第五行 ":PrintFile" 那里执行,也就是说中间的都会略过不执行;标签的名字可以随便取,像是 "ABC_NAME001" 等等

第四行,如果第三行没有跳走的话,就会 GOTO 跳到 FileNotExist

第五~七行,是 PrintFile 所要执行的内容;TYPE <档名> 会把那个档案印出来,eg. TYPE list.txt

第七行,执行完记得要再 GOTO 到底下的 :End,否则它会继续往下执行第八行、第九行喔!

第八~十行,是 FileNotExist 所要执行的内容

 


2016/08/06  更新:

 

终于了解了 FOR 的用法,以及其他变数的用法了~!

可以前往底下这个连结:(如果不排斥英文的话XD)

Batch File Commands

如果还是需要中文讲解,

就在我这篇底下留个言吧~ 我再帮忙解惑~

 


2017/07/26 更新:

 

补充几篇连结:

命令提示字元 19:回圈进阶   如果你觉得上面的介绍还太粗浅了,这里有更详细 FOR 功能解析!

Set - Environment Variable   这个是以 SET 为例,它有最详尽的功能说明。(应该说它就是说明书,最详尽但未必好懂就是了) 你可以在搜寻框框打任何想查询的其他指令喔!

 

除了以上两个资源颇丰的连结外,以下是我个人另外找到的零碎资料:  (虽然目前只找到一个的样子XD)

Q1: Batch 如何用正规表示式(regex) 来筛选特定的字串呢?

A1: 使用 findstr /r  (也可搭配 errorlevel)

你可以来实验看看以下这段,然后再把var 改成 fbcefg 看看有何不同,最后再把第二行框框里的改成 [a-z]

set var=abcefg

echo %var% | findstr /r "^[a-c]">nul

if errorlevel 1 (echo no) else (echo yes)

第一行就是简单的设定变数,将var 设定成那串字

第二行首先,就是先把var 给印出来(记得变数要取用,需要在前后都加上%

但是后面有个 "|",是重新导向的意思,所以原本要印到萤幕上的字,就丢给了后面的 findstr 处理。

"^[a-c]" 意思是以 a~c 字母开头者,像是 ^[a-zA-Z0-9],就相当于寻找所有的英文及数字开头者。(详情请google正规表示式)

最后的 ">" 也是重新导向的意思,丢给nul 的目的是让它不要显示出来。你可以试试看把 ">nul" 拿掉,结果就会被印到萤幕上了。

第三行是依据 errorlevel 的值,来决定要显示 yes or no。原理是这样的:任何指令都会有回传值,照理说如果正确执行了,就会回传 0,若失败了就不是 0。

而errorlevel 会保存上一行指令的最终回传值,因此若 findstr 有成功找到,则回传值为 0,反之则大于 0  (Batch File Commands 这篇的 IF 底下有些说明)

 

相关文章