https://blog.csdn.net/smilematch/article/details/52798840
自从操作系统诞生以来,批处理就是最重要的功能之一,但在Windows大行其道的今天,批处理这个概念对普通用户而言已经越来越远,但不可否认,作为开发人员,这是必须要掌握的技能之一。在Linux系统下,批处理通过shell脚本完成,而在windows平台下,批处理的文件后缀为.bat。bat文件其实就是dos命令的集合,但许多dos命令都被废弃了,今天就来讲解一下bat文件中使用的那些命令与bat文件的基本写法。
基础命令
echo
这是最基础的显示命令,将其后的内容显示在命令行,后面一般可以跟字符串、变量等,基本和Linux中的echo命令相同:
echo "Hello,My First Bat."
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定格式的文件中。而在bat文件头,一般使用echo off语句表示后面的命令行不再显示。该语句一般和@联合使用,@用于命令之前,表示当前命令行不显示,但仅仅适用于当前行。所以,一般我们所见的bat文件第一行如下:
@echo off
call
顾名思义,本命令用于调用外部bat文件,用法位call+【文件名】。如果不用call而直接调用别的批处理文件,那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令。
call a.txt
rem
注释,有些类似于C语言中的//,后面的内容不会执行,只是用于阅读源码时参考。
cd
chdir的简写,相信使用过命令行的人都不会陌生,用于切换路径。有一些特殊的符号需要掌握一下,以下是基本用法:
rem 假设当前目录为根目录C盘,其中有my、your两个文件夹,F盘有his文件夹
rem 进入my文件夹
cd my
rem /表示根目录,从my进入your
cd /your
rem 返回上次目录
cd -
rem 返回上级目录
cd ..
rem 返回根目录
cd . rem 或者cd /
rem 切换到F盘中的his,记住\d 不能省略
cd \d D:/his
pause
顾名思义,该目录暂停程序执行,运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue…的提示,等待用户按任意键后继续。
start
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是32位GUI应用程序时,CMD.EXE不等应用程序终止就返回命令提示。如果在命令脚本内执行,该新行为则不会发生。
choice
choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
choice参数列表如下:
参数列表:
/C choices 指定要创建的选项列表。默认列表是 “YN”。
/N 在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。
/CS 允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。
/T timeout做出默认选择之前,暂停的秒数可接受的值是从0到9999。如果指定了0,就不会有暂停,默认选项会得到选择。
/D choice 在 nnnn 秒之后指定默认选项。字符必须在用 /C选项指定的一组选择中;同时,必须用/T指定 nnnn。
/M text 指定提示之前要显示的消息。如果没有指定,工具只显示提示。
/? 显示帮助消息。
choice /C YNC /M "确认请按Y,否请按N,或者取消请按C。"
choice /T 10 /C ync /CS /D y
choice /C ab /M "选项1请选择a,选项2请选择 b。"
choice /C ab /N /M "选项1请选择a,选项2请选择b。
goto
指定跳转到标签,找到标签后,程序将处理从下一行开始的命令。goto命令因为它的一些特性在不少高级语言中变得臭名昭著,但在脚本语言中还是很有必要的。
if {%1}=={} goto noparms
if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。)
:noparms
echo Usage: monitor.bat ServerIP PortNumber
goto end
if
if 表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:
1. if “参数” == “字符串” 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
if "%1"=="a" format a:
if {%1}=={} goto noparms
if {%2}=={} goto noparms
- if exist 文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
if exist config.sys edit config.sys
- if errorlevel / if not errorlevel 数字 待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
if errorlevel 2 goto x2
程序运行时都会返回一个数字,称为错误码errorlevel或称返回码,常见的返回码为0、1。
for
for命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。在批处理文件中使用for命令时,指定变量请使用 %%variable。其实也就和高级程序语言中的for大同小异,其语法如下:
for %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
好了,基本上常用的命令也就这么多了,dos命令其实还很多,如set、|、shift等等,总之,要想写好bat文件,命令的熟悉是必不可少的。
在bat中使用变量
任何语言中变量都是必不可少的,bat文件中当然也是如此。说完了基础命令,接下来就让我们说说如何在bat文件中使用变量吧。
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。
如果现在有一批处理文件t.bat在C盘根目录下,内容如下:
@echo off
type %1
type %2
那么在命令行输入C:/>t a.txt b.txt 运行,%1就表示a.txt,%2就表示b.txt,其他参数顺延。
一个例子说明
当然要学号任何语言,光靠看语法是无济于事的,必须要分析源程序,最好是那些使用广泛的源程序。为了方便讲解,我从tomcat7中取出了批处理文件startup.bat并以注释的方式写上一些说明,方便大家学习。
@echo off
rem 创建当前目录的环境变量
set "CURRENT_DIR=%cd%"
rem 判断tomcat安装目录的环境变量是否正确,若正确,转到gotHome
if not "%CATALINA_HOME%" == "" goto gotHome
rem 若不正确,把当前目录设置为软件根目录
set "CATALINA_HOME=%CURRENT_DIR%"
rem 判断是否存在catalina.bat批处理文件,存在,转到okHome,否则返回上级目录
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
rem 返回上级目录并将软件根目录设为该目录
cd ..
set "CATALINA_HOME=%cd%"
rem 打开当前目录
cd "%CURRENT_DIR%"
rem gotHome模块
:gotHome
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
rem gotHome模块结束
rem okHome模块
:okHome
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
rem okHome模块结束
:okExec
rem Get remaining unshifted command line arguments and save them in the
set CMD_LINE_ARGS=
:setArgs
rem 判断命令行参数是否存在
if ""%1""=="""" goto doneSetArgs
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
:doneSetArgs
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end