用户
搜索

【教程】Batch 入门教程 - 第一章:部署与 Hello World!

2019-1-28 14:56| 发布者: 小i| 查看: 43| 评论: 0|原作者: subilan

Batch 入门教程


Banner


在本教程中,您将了解并学习与 Windows Batch 有关的知识和编程方法,用以解决在日常生活中所遇到的简单问题,或者利用 Windows Batch 建立一个最初级的编程思维方式。


具体来讲,您可能不仅在这里学到如何编写和运行 Windows Batch 程序,而更有可能学习到脚本语言的入门方式,从而能够更加顺利地投入到以后的开发和探究中。


教程简介


本教程使用 Markdown 编写。


本教程将会根据内容的难易程度,逐条推进,且大部分内容都是面向新手的。因此,也许您可能会发现某些语言叙述过于冗杂不必要,但是请谅解,因为这也许是因为笔者讲话过于啰嗦或者是为了照顾新手。如果您仍然觉得晦涩难懂,欢迎给笔者留言,笔者会尽最大可能提供帮助。


格式说明


大部分内容以正文论述,仅当内容重要的名词或者需要被强调时会被加粗显示。对于标题格式,有如下规定:










































标题大小 对应含义与内容 DOM 术语
1 Batch 入门教程的标题 H1
2 章节 H2
3 条目 H3
4 要点和知识点 H4
5 较大的粗体 H5
6 undefined H6

本系列文章说明



  1. 本系列文章皆为原创文章,未经允许禁止转载

  2. 本系列文章作者为 Subilan

  3. 时间:2019.1.25

  4. 本系列文章最后的隐藏部分是针对本次文章做的总结以及布置的课后任务,请让读者自行选择


以下,我们来展开第一章的学习,这是笔者第一次在此论坛上写作,请大家多多包涵。


初识


你好,批处理。


批处理是什么?



批处理(Batch)通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中,它是由DOS或者Windows系统内嵌的解释器(通常是COMMAND.COM或者CMD.EXE)解释运行。类似于Unix中的Shell脚本。批处理文件具有.bat或者cmd的扩展名,其最简单的例子,是逐行书写在命令行中会用到的各种命令。也可以在批处理文件后面加上更多种类的参数。



这是摘自 Wikipedia 的一段对批处理的描述。接下来,笔者介绍一下批处理。


Batch,全称 Windows BatchFile,中文名称为“批处理”,繁体中文译为“批次檔”。它是 Microsoft Windows 自带的一种脚本语言,且相对比较简陋,它的解释器是 Command Prompt(即命令提示符)。


批处理的历史可以追溯到 DOS 时期,直到目前为止还有许许多多的 CMD 指令都是沿用的 DOS 指令,没有改变。较为经典的有 copymovedirdel 等基本文件操作。


我们了解这么多并没有任何的用处,仅仅是为了让我们能够知道自己到底在写些什么。


批处理的运行


上文中提到,批处理的解释器是命令提示符(cmd.exe)。那么批处理的运行就很好阐述了。我们将代码书写在可读的纯文本文件中(但是扩展名为 .bat 或者 .cmd),执行后直接提交给 cmd.exe 进行处理,最终执行结果。


批处理的指令是逐行执行的,这意味着您执行指令的先后顺序将会影响执行的执行结果。


Batch 执行流程示意


客户端输入,指的是用户在打开您的程序时,总会有一部分由客户端提交的工作(在此我们把批处理比作是用作处理的后端),例如,您的程序可能使用 set /p 允许用户输入一些自定义的数据,这是一种输入。此外,打开程序本身也是一种输入,我们在这里将它称为执行输入。因此,只要我们运行了这个程序,那么我们必定给予了一个输入。


这两种输入在本质上没有任何区别,都是由客户端用户授权后执行的操作。


程序代码,指批处理本身的代码。


cmd.exe,指的是位于 %systemdrive%\Windows\System32\cmd.exe,它就是命令提示符的本体。


那么,客户端输入一经提交,就会按照程序代码原有的约定去处理这些输入。例如,执行输入的处理方式是一定的,即从代码第一行执行,这就是它的处理方式。而对于其它的,例如这时您正在运行一个计算器的程序,那么您输入的数字则会按照代码的约定去进行计算,最后反馈结果。而按照代码的约定则是程序代码发挥的作用,计算则是由 cmd.exe 完成的。


这些您并不需要深入地去理解,仅仅了解一下即可。


批处理的开发环境


众所周知,一般的脚本语言都不需要任何的特殊开发环境。有些,例如 Python,它可能需要您安装解释器,但是并不需要您安装 IDE 之类的环境来让开发过程更加简便,甚至无法缺少 IDE。


批处理使用系统自带的 notepad.exe 就可以开发,但是实际上却很吃亏,因为它没有高亮,也没有华丽的页面,仅仅是一个编辑纯文本的工具而已。


Notepad 外观预览


随后就出现了 Notepad++,它的页面很不赖,所以建议一般的新手就使用它来进行开发。


Notepad++ 外观预览


当然,如果您对较为高阶的编辑器感兴趣(这些编辑器往往会有更多的开发者参与开发,且有专门的社区等),您不妨尝试一下 Microsoft 开发的 Visual Studio Code。它比 Visual Studio 更加轻量(比 Notepad++ 更重量),且可以通过自己的努力或者其它的方式在上面开发任何语言,包括 Batch。


Visual Studio 外观预览


上图中用到的主题是 One Dark Pro。


Notepad++ 官方下载地址:Notepad++ Download,Visual Studio Code 官方下载地址:Visual Studio Code


下载 Notepad++,直接访问如上网址后点击那个大大的 Download 即可(但是这个无论任何机型都会下载 32-bit 版本,如果需要 64-bit 版本可以在下方寻找。)。


Notepad++ 安装事项


Notepad++ 下载


在安装 Notepad++ 的时候,出现这个页面,在此笔者说明一下:


Notepad++ 的安装页面


第一项 Don't create shortcut on Desktop,勾选后桌面不会自动创建快捷方式(如果你喜欢干净的桌面就勾选吧,当然只是对这个程序有效)。


第二项的意思是,勾选后就不使用 %APPDATA% 路径了。这个路径位于 您的系统盘\Users\您的用户名\AppData,是一个隐藏文件夹,专门用来存储用户的数据。文字的意思是如果您在一个 U 盘里用这个软件,且没有勾选这一项,那么 Notepad++ 会把信息全部存储到您电脑上,那么当你把 U 盘拔了以后放到其它的电脑上,它们的电脑上并没有您的用户数据(因为您的数据在您的电脑上),那么 Notepad++ 就可能不能正常运行。勾选后就可以随时随地运行了。


Visual Studio Code 安装事项


在安装 Visual Studio Code 时,会有这个页面


VSC 的安装页面


我推荐您勾选下面的四项,这四项勾选以后,您在以后编辑软件的时候会更加快速。如果勾选,当您右键选择一个可编辑文件的时候,会出现 Open with Code 选项,使用这个选项,可以快速使用 Visual Studio Code 打开选中文件。


Open with Code


在 Visual Studio Code 安装完成后,点击左下角的齿轮图标,再点选“设置”(英文版为 Settings),


齿轮


即可进行设置。如果您喜欢开发者风格的设置方式,可以在打开的设置页面的右上角选择 "{ }" 图标:


{}


这样就会打开配置的 json 文件,您可以在这里按照您的个人喜好进行更改。当然这需要一定的基础。如果您想要快速获得一个适合的开发环境,笔者在这里有正在使用的配置文件,可供参考:


{
    // 是否启用 git,默认是启用的。如果您用不到,可以关掉。
    "git.enabled": false,
    // 快速建议,other 为其它,comments 为关键词和上下文的建议,strings 为您的文字建议。
    // 个人建议按照如下的方式进行配置。
    "editor.quickSuggestions": {
        "other": true,
        "comments": false,
        "strings": false
    },
    // 编辑器的字体,把英文字体放在前面,中文字体放在后面,可以达到中英不同字体混用的效果。
    "editor.fontFamily": "Consolas, 'Microsoft Yahei UI', 微软雅黑, monospace",
    // 默认保存,在这里默认不开启。如果您想要开启默认保存,可以将该选项改成 "afterDelay"
    // "files.autoSave": "afterDelay",
    "files.autoSave": false,
    // 控制台的字体,可以单独设置。
    "terminal.integrated.fontFamily": "Consolas",
    // 编辑器的图标样式,这些往往需要您去扩展程序市场寻找。
    // 推荐一个叫做 file-icons 的图标包。
    "workbench.iconTheme": "material-icon-theme",
    // 控制台使用什么控制台。
    // 这一项可以改成 Windows 下的控制台,比如 Powershell 或者 CMD,只需要修改如下路径即可。
    // 或者也可以改成第三方控制台比如 DOSBOX。
    "terminal.integrated.shell.windows": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
}

笔者的意思是,如果您熟悉的话。如果不熟悉可以不使用这种方法。


综上,开发环境的配置就结束了。当然,您也可以选择不配置,但是这样就无法有舒畅美观的写作体验。一般上面的过程,您可能需要 3~30 分钟来完成(按照正常的计算机水平,可以在 7 分钟之内完成)。在下文中,我们使用 Visual Studio Code 进行演示。


入门


入门,进入门,进入这扇门,进入这样一扇(门框+门板+门铃+门锁),使用脚的指定部位完成动作以进入主函数,kkkkk。


入门概述


入门是一切的起点,这些我们都知道。在入门这一章节中,您将首先接触三个简单的指令:echopauseexit。这些指令足够您编写一些能够显示信息(例如显示 Hello World!)的程序,但是却远远不够于正常编程。当然,一切都是来源于基础的,所以本章节可以算是比较重要。


重要的并不在于内容,而是理解。如果您看不懂本章节的某些句子,您可以尝试多读几遍,努力去理解。如果您实在无法理解,欢迎告诉笔者,笔者会一一详细回复的。


Hello World!


Hello World!,这可能是每一个入门者都会编写的第一个程序。它们往往只是一个简单的输出,但是却代表着无数的成功也无法比拟的喜悦。在 Batch 中,您也可以编写 Hello World。


创建 Batch 文件


创建 Batch 文件有很多种,但是本质就是更改扩展名。在 Windows 10 系统中,若要显示扩展名,请在资源管理器中这样选择:


查看扩展名 - Windows 10


如果您使用是 Windows 7,请按照如下方法进行(用 Windows 10 来演示):


查看扩展名 - Windows 7-

查看扩展名 - Windows 7--


这样,您的文件就会多出了一个扩展名后缀,创建批处理文件就简单了。首先,右键选择“新建“ - ”新建文本文档“:


新建文本文档


然后将您的文本文档重命名,将 .txt 后缀更改为 .bat 或者 .cmd。这两者只有名称上的区别,相信我。


更改扩展名


在弹出的对话框选择”确定“。这个对话框的意思是说,避免您误更改了扩展名,又忘记了原先的扩展名,那么就不能再运行以前的程序了。


确认


这样,您就得到了一个崭新的 Batch 文件!我们右键它,选择 Open with Code,这样就来到了它的编辑页面:


编辑 Batch


开始编写


接下来我们可以输入我们的代码了:


@echo off
:: 第一个程序!
echo Hello World!
pause
exit

运行效果:


Hello World!


Press any key to continue... 的中文为 按任意键继续...,意思是按下任何一个键盘上的按键再继续执行下面的代码。接下来我们来分析一下我们写的代码。


这是一行 echo 指令,它的参数是 off。这是一个重要的概念。这一行的含义是”关闭回显“。


可能”回显”这个概念不是很清晰,它指的是在屏幕(或者说控制台)上的回响显示。也就是说,当你执行一个指令后,大多数情况下 cmd.exe 会给出一个反馈的信息,如果您只想要屏幕上显示这个反馈的信息,那么就可以关闭回显。一般情况下,我们都关闭回显。


@echo off

这是一行注释,在 Batch 内,注释可以以双分号或者 REM 开头:


:: 第一个程序!
REM 第一个程序!

这是一行 echo 指令,它的参数是后面的一大串信息 Hello World!。这是最简单的指令之一,它的作用是将后面的参数直接当作回响打印出来。与其它指令不一样,echo 的参数即使有空格也不会被错误识别,因为它的作用实在是太简单了,因此不可能会有多个参数。


echo Hello World!

这是一行 pause 指令,中文为 暂停pause 用于在屏幕上显示一行 按任意键继续... 的信息,来由用户确认继续执行。当遇到 pause,就会立即停止一切工作,直到用户按下任意键,才会继续执行下方的代码。


在有些情况下,pause 是必不可少的,因为它具有暂留性。如果我们在这段代码中去掉它,我们将不会看到 Hello World!,而仅仅是一个黑色(或者其它的颜色)的窗口一闪而过。于是,我们给出定义:


暂留性,是指对屏幕具有暂留效果的指令。批处理遇到此类指令后,都不会继续执行下方的指令,而是等待该指令本质上所要求的一个用户的输入的确认,再继续处理。pause 是最单纯的暂留性指令,除此之外还有 set /pping 之类。


pause

最后一行是 exit 指令,即退出。这是一个流程控制性指令,它的作用是对会话进行结束,常常表现为关闭窗口。我们给出定义:


流程控制性,是指对编程处理的流程有控制作用的指令,例如 exit 为退出,call 为转入,pause 为暂停。


为了避免本系列的内容定义过多导致冗杂,笔者在以后的正文中会避免使用新的名词。


我们的 Hello World 完成了,接下来我们进入对单独指令的深度刨析中。


echo


echo 是一个回显指令,它用来打印一些内容。例如,执行


echo 123

则会在屏幕上输出 123。


Sample1


所以,它的参数十分简单,仅仅是 off/on[zxsq-anti-bbcode-Message]。在 help 中,对 echo 的解释为:



Displays messages, or turns command-echoing on or off.


ECHO [zxsq-anti-bbcode-ON | OFF]


ECHO [zxsq-anti-bbcode-message]


Type ECHO without parameters to display the current echo setting.



意思是说“显示信息,或者打开/关闭命令回显”,如果我们仅仅输入一个 echo 而没有任何参数的话,则会告诉你回显是开启还是关闭的。


例如我们直接在 cmd 内输入 echo,那么结果为:


echo


需要注意的是,echo 不能输出 off 或者 on(但是可以输出类似于 offer,is on 之类的含它们的组合)。


关闭回显


为了避免源码在执行过程中会被输出,我们通常关闭回显。上文中的 Hello World 程序在没有关闭回显的时候是这样的:


打开回显的时候...


这可不是我在打指令,而是整个批处理文件运行的结果。这些就叫做“回显”。


但是当我们在开头加入 echo off(没有 @),情况就不一样了:


echo off


我们得到了与先前类似的输出,但是我们却发现 echo off 本身的执行依然看得到回显,这样我们的 @ 就起到作用了。它隐藏单条指令的回显。


这也就意味着我们在最开头加上 @echo off 就相当于是把每一行指令前面都加上 @


pause


pause 在上面已经作了解释,但是它的原理并没有我们说的那么复杂。在 help 中对它的解释只有一行,示例一行:



Suspends processing of a batch program and displays the message


Press any key to continue . . .



就是显示 按任意键继续... 并暂停执行的一个指令。


exit


exit 执行后会退出当前会话,因为没有其它的特殊措施,所以一般表现为窗口被关闭。但是如果一个批处理是被调用的:


:: a.bat
@echo off
call b.bat
pause
exit

:: b.bat
echo This is B!
exit

:: a.bat 调用了 b.bat

注:call 指令会在以后的进阶中学到,现在您只需要知道它是一个可以调用其它批处理文件的指令,也就是说可以在一个批处理文件中执行另一个批处理而不打开新的窗口。


这样做,一旦调用 b.bat 就会直接退出(不是退出 b.bat 而是退出整个程序,即关闭窗口),因此我们得到的还是一个闪框(我们以后就叫“突然闪过的黑色或者其它别的颜色的一个控制台窗口”为闪框吧!)。


但是当我们把 b.bat 里的 exit 加入一个参数:/b 233


:: BEFORE / 原先
exit

:: AFTER / 更改后
exit /b 233

这样我们得到的结果就不一样了。我们居然停留住了整个窗口,并且显示 This is B!按任意键继续...。这是为什么呢?


退出当前进程


参数 /b 指定一个退出的代码,称为 exitCodeexit /b [zxsq-anti-bbcode-exitCode] 类似于其它语言中函数的 return 一样,返回一个值(不过 exitCode 只能为数字),并且执行以后进程就结束了。


如果你不清楚其它语言中函数的 return 也没关系,看看下面这个例子:


// C++
#include <iostream>
using namespace std;

int main()
{
    return 0;
}

这就是一个毫无意义的 C++ 程序,它的效果与


:: Batch
@echo off
exit /b 0

类似。


如果我们不加上这个参数(/b),那么退出的会是整个程序。但是我们加上,我们退出的就仅仅是当前的程序。如果我们单独执行 b.bat,我们得到的是一个闪框,因为它本身被自己的 exit 给结束了。但是当我们用 a.bat 去调用 b.bat 的时候,exit /b 233 只会退出当前程序,于是 b.bat 调用后遇到了 exit /b 233,退出了 b.bat,继续执行 a.batcall 下面的代码,即 pause


上述我们的流程用图来表示是这样的:


exit /b 流程


但是如果我们在 b.bat 里的 exit 没有带上 /b 参数,它退出的将是整个程序:


exit 流程


此外,exitCode 还有另外的作用。例如上面,我们执行了 exit /b 233,则代表我们的 exitCode 就是 233,这样,在 a.bat 内的 %ERRORLEVEL% 会被设置为这个 exitCode%ERRORLEVEL% == 233


至此,入门部分就结束了。接下来我们将学习的是进阶,在这里,您将会学习到更多的流程管理,以及有关逻辑判断等知识。



小i,如果您要查看本帖隐藏内容请回复



鲜花
鲜花
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋