文章主要通过一个自动编译java的bat来简单讲解bat的使用,以及一些重点,该内容不适应于用来学习。该文件结果为,例子,一些重点的命令使用
下面是一个自动编译Java的bat
@echo off ;;设置下面的命令都不在终端中输出
;;递归指定目录,默认为bat所在目录中的java文件,然后在进行编译,遇见编译错误将提示用户是否删除已编译成的class:startF ;;定义一个startF标签,当用户输入的目录不存在时,可以重新输入
SET /P pdath=输入路径(使用bat文件所在目录,请按回车): ;;在终端中输入java源文件所在目录,默认会使用该bat所在的目录
IF "%pdath%"=="" SET pdath=%~dp0 ;;如果没有输入(直接按回车),则通过%~dp0来获取该bat所在的目录并且设置变量pdath
cd %pdath% ;;cd到该目录中
IF %errorlevel%==1 SET errorlevel=0&set pdath=&goto startF ;;如果该目录不存在或cd出错,将错误代码设置为0并且将pdath变量设置为空,然后在回到starF标签处重新执行
;;遍历目录中的java源文件
FOR /R %%i IN (*.java) do (
CALL:compile "%%i" ;;将java源文件路径当作参数,传到compile标签进行编译)
PAUSE ;;暂停
EXIT ;;退出
;;编译失败后提示
:throwCompile
SET /P choose=请1将删已编译0不删或直接回车:
IF "%choose%"=="" EXIT ;;默认不输入则直接退出
IF "%choose%"=="0" EXIT ;;输入0则直接退出
IF "%choose%"=="1" GOTO delclass ;;如果输入为1则转到delclass处执行删除命令
SET choose=&GOTO throwCompile ;;如果输入其他没意义的参数,则要求用户重新输入
;;删除刚刚编译完成的class
:delclass
;;遍历该目录中的所有class文件,并执行del删除命令及输出提示信息
FOR /R %%d IN (*.class) DO del "%%d"&ECHO "已删除%%d"PAUSE
EXIT
;;编译
:compile
javac %1 ;;编译参数指定的java源文件
;;如果出错则,转到throwCompile处,否则提示编译成功
IF %errorlevel%==1 ECHO "编译%1出错"&GOTO throwCompileECHO "完成%1编译"
重点讲解
修改暂停的输出字符,echo 提示的信息&pause>nul
For用法
FOR 参数%%变量名IN (相关文件或命令) DO 执行的命令
参数:FOR 有4 个参数/d /l /r /f
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。
参数/d:主要用于目录搜索,不会搜索文件,set里面可以包含通配符*和?
参数/R FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 检查以[drive:]path 为根的目录树,集仅为一个单点(.)字符,则枚举该目录树,可以包含通配符
参数/L :FOR /L %variable IN (start,step,end) DO command [command-parameters] 该集表示以增量形式从开始到结束的一个数字序列
参数/F:迭代及文件解析
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
带引号的字符串"options"包括一个或多个
指定不同解析选项的关键字。这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个)skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的for 本身。这会导致额外变量名称的分配。
m-n格式为一个范围。通过nth 符号指定mth。如果符号字符串中的最后一个字符星号,那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。
usebackq - 使用后引号(键盘上数字1 左面的那个键`)。
未使用参数usebackq 时:file-set 表示文件,但不能含有空格双引号表示字符串,即"string"单引号表示执行命令,即'command'使用参数usebackq 时:file-set 和"file-set"都表示文件
当文件路径或名称中有空格时,就可以用双引号括起来单引号表示字符串,即'string'后引号表示命令执行,即`command`
FOR 命令中的变量
~I - 删除任何引号("),扩展%I
%~fI - 将%I 扩展到一个完全合格的路径名
%~dI - 仅将%I 扩展到一个驱动器号
%~pI - 仅将%I 扩展到一个路径
%~nI - 仅将%I 扩展到一个文件名
%~xI - 仅将%I 扩展到一个文件扩展名
%~sI - 扩展的路径只含有短名
%~aI - 将%I 扩展到文件的文件属性
%~tI - 将%I 扩展到文件的日期/时间
%~zI - 将%I 扩展到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将%I 扩展到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩展到空字符串
IF命令
IF [NOT] ERRORLEVEL number command (尽量使用这种形式%errorlevel%==0)
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
IF EXIST filename (
del filename
) ELSE (
echo filename missing
)
Call命令和GOTO命令的区别?
Call命令执行完后会回答调用的地方,而Goto则不会
Call命令能带参数和返回值,而GOTO不能