场景描述
最近有在写一个简单的 .bat
批处理命令脚本,并不复杂.共大概执行了有3行代码的样子.
mvn clean package -Dmaven.test.skip=true -DskipTests
echo "logging.level.root=false">demo01/target/application.properties
java -jar hsf-http-lite-start/target/run.jar top.ghimi.hsfhttplite.Application
但是不知道怎么回事,在具体执行调用的时候总是第一行执行完成后就自动退出了.后面的命令也没有再继续执行的样子.
问题定位
经过一番百度,终于找到有同学是遇到和我相同的问题。问题出在了 mvn
命令上。
因为mvn命令对于批处理来讲是外部命令,批处理在第一句执行完发现没有找到内部命令,就结束了,需要调用外部命令时,需要在前面加call,以表示调用。
诸如此类的回答还有不少,大多和上面的描述大同小异。但我还是一头雾水,虽然上面给出了具体的解决方案,通过 call
命令或者 start
命令进行调用,但是我却没有搞懂 外部命令 和 内部命令 这两个关键词到底是什么。于是我又去求助了谷歌,获取到了下面的描述:
Maven uses batch files to do its business. With any batch script, you must call another script using the call command so it knows to return back to your script after the called script completes. Try prepending call to all commands.
这里的答案是和百度得到的答案是相同的,但是在描述方面却有些差别。简单来说就是 Maven 的工作原理实际上是一个 批命令
脚本。而在Windows中一个脚本
调用另外一个脚本
,需要添加参数 call
来让调用方获取被调用方的返回结果,而不是将被调用方的返回结果当做自己的返回结果返回。
可能有点绕,这里贴张图来进行说明下:
如图,我们现在当前目录下有三个脚本,分别是脚本1
(script1.bat
),脚本2
(script2.bat
),脚本3
(script3.bat
)三个脚本。其中在脚本1
中顺序调用了脚本2
和脚本3
,脚本2
和脚本3
中各自执行一条输出命令。
代码如下:
#---------- script1.bat------------------------------------------------------------
script2.bat
script3.bat
# ---------- script2.bat------------------------------------------------------------
echo "hello"
# --------- script3.bat-------------------------------------------------------------
echo "world"
在我们不添加 call
命令进行调用的时候,我们执行脚本1的顺序是:
- 执行脚本2
- 执行输出语句
- 返回
- 返回
- 结束
也即脚本1
在拿到了脚本2
的返回结果后,误以为脚本2的返回就是它的返回。结果拿到该返回结果后就直接 return
了,然后该执行的剩下的命令也不执行了.
而当我们添加 call
命令进行调用的时候,我们执行脚本1
的顺序是:
- 执行
脚本2
- 执行输出语句
- 返回
- 执行
脚本3
- 执行输出语句
- 返回
- 返回
- 结束
可以看到此时由于 call
命令的标记,脚本1
不再将脚本2
的返回当做是自己的返回而直接返回了,问题解决。
参考资料
bat 运行文件只执行了一条命令
Why does only the first line of this Windows batch file execute but all three lines execute in a command shell?
bat文件执行完第一句后就不执行了
关于批处理文件只执行一行的问题