看着bin目录下就一个gradle.bat,也很少研究bat文件,现在就学习一下吧!
//@放在命令行前将关闭命令回显,非DEBUG模式,@echo off ,这条命令是关闭回显,就是不显示后面的命令执行情况,并且部分命令的执行结果页不显示
@if "%DEBUG%" == "" @echo off
//rem表示注释,REM是批处理中的注释命令,@REM的作用与REM相同,只不过在回显上有差别,如果echo off,@要与否是无所谓的.但是,如果echo on,在运行的时候,不带@的行的DOS命令都会被回显,包括注释
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
//如果操作系统是windows操作系统,setlocal:启动批处理文件中环境变量的本地化,和endlocal配套使用,使得某些变量的变化只是维持在setlocal和endlocal之间
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
//清空DEFAULT_JVM_OPTS
set DEFAULT_JVM_OPTS=
//=%~dp0获取当前批处理的运行目录路径
//设置DIRNAME为当前gradle.bat文件的绝对路径,根据上篇博客设置,那路径为D:\gradle-1.12\bin
set DIRNAME=%~dp0
%0 批处理文件本身,包括完整的路径和扩展名
%~1 - 删除引号(\"),扩充 %1
%~f1- 将 %1 扩充到一个完全合格的路径名
%~d1- 仅将 %1 扩充到一个驱动器号
%~p1- 仅将 %1 扩充到一个路径
%~n1- 仅将 %1 扩充到一个文件名
%~x1- 仅将 %1 扩充到一个文件扩展名
%~s1- 扩充的路径指含有短名
%~a1- 将 %1 扩充到文件属性
%~t1- 将 %1 扩充到文件的日期/时间
%~z1- 将 %1 扩充到文件的大小
上面有点晕吧,好吧,请允许我贴出如下达人代码,你们拷贝到一个bat文件中运行一下,理解一下:
@echo off
Echo 产生一个临时文件 > tmp.txt
Rem 下行先保存当前目录,再将c:\\windows设为当前目录
pushd c:\\windows
Call :sub tmp.txt
Rem 下行恢复前次的当前目录
Popd
Call :sub tmp.txt
pause
Del tmp.txt
exit
:sub
@echo off
Echo 删除引号:%~1
Echo 扩充到路径:%~f1
Echo 扩充到一个驱动器号:%~d1
Echo 扩充到一个路径:%~p1
Echo 扩充到一个文件名:%~n1
Echo 扩充到一个文件名:%~n0
Echo 扩充到一个文件扩展名:%~x1
Echo 扩充的路径指含有短名:%~s1
Echo 扩充到文件属性:%~a1
Echo 扩充到文件的日期/时间:%~t1
Echo 扩充到文件的大小:%~z1
Echo 扩展到驱动器号和路径:%~dp1
Echo 扩展到驱动器号和路径:%~dp0
Echo 扩展到文件名和扩展名:%~nx1
Echo 扩展到类似 DIR 的输出行:%~ftza1
Echo.
Goto :eof
//如果DIRNAME为空,设置DIRNAME为当前路径
if "%DIRNAME%" == "" set DIRNAME=.
//设置APP_BASE_NAME为gradle(记得0么,当前文件)
set APP_BASE_NAME=%~n0
//设置APP_HOME为DIRNAME的上一级目录
set APP_HOME=%DIRNAME%..
@rem Find java.exe
//如果系统中定义了JAVA_HOME,转向执行findJavaFromJavaHome代码段
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
//执行java -verion命令,同时关闭该命令的结果输出
%JAVA_EXE% -version >NUL 2>&1
好吧,上面我还要啰嗦一下。引用解释:
>,将一个句柄的输出写入到另一个句柄的输入中。
<,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
常用句柄:0、1、2,未定义句柄:3—9
1>nul 表示禁止输出正确的信息
2>nul 表示禁止输出错误信息。
其中的1与2都是代表某个数据流输入输出的地址(NT CMD 称之为句柄,MSDOS称之为设备)。
句柄0:标准输入stdin,键盘输入
句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON)
句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON)
其中的stdin可被<重定向,stdout可被>、>>重定向。
实话,你们看懂没,我有点不懂,好吧,这样解释:
> nul : 把标准输出重定向至空文件(nul),即丢弃标准输出,也就是不在屏幕上显示输出标准结果。
2>&1:把标准出错输出重定向至标准输出,因为标准输出已被重定向至nul(丢弃),所以标准出错也会被丢弃。
或者>NUL 2>&1就是关闭命令结果输出
//如果上述命令(java -version)执行成功,则跳转至"init"
if "%ERRORLEVEL%" == "0" goto init
当使用“if errorlevel value cmmand” 时含义为:如果返回的错误码值大于或等于value的时候,将执行cmmand操作。
当使用“if %errorlevel%==value cmmand” 时,含义是:如果返回的错误码值等于value的时候,将执行cmmand操作。
一般上一条命令的执行结果返回的值只有两个,"成功"用0 表示 "失败"用 1 表示,errorlevel 返回值可以在0~255 之间,例如xcopy 默认的errorlevel 值就有5 个,分别表示5 种执行状态
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
//findJavaFromJavaHome代码段开始
:findJavaFromJavaHome
//设置当前环境的JAVA_HOME为系统环境变量中的JAVA_HOME,其实也可以这样写:set JAVA_HOME=%JAVA_HOME%
set JAVA_HOME=%JAVA_HOME:"=%
//设置java程序的路径
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
//设置成功,则跳转至init段
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
//如果不是NT系统,则跳转至win9xME_args
if not "%OS%" == "Windows_NT" goto win9xME_args
//如果安装了4dos,则跳转至4NT_args
if "%@eval[2+2]" == "4" goto 4NT_args
4dos是一个命令编译器="dos shell"="command.com",比command.com多一些命令,可用"%@eval[2+2]" == "4"来判断
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
//设置CLASSPATH,从这可以看出是从gradle的launcher开始的
set CLASSPATH=%APP_HOME%\lib\gradle-launcher-1.12.jar
@rem Execute Gradle
//执行命令,就是JAVA中的执行jar命令行方式,org.gradle.launcher.GradleMain是主类,里面有main方法,可以把gradle的源代码下来直接从这个类开始跟踪。
//记得刚开始的:@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
//这里你可以制定相关OPTS
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.launcher.GradleMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
//gradle命令执行成功则跳转mainEnd
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega