当前位置: 首页 > 工具软件 > gradle-shell > 使用案例 >

且看且学Gradle--(2)gradle.bat解析

红朝
2023-12-01

看着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

 类似资料: