bat脚本执行第一行命令后退出

场景描述

最近有在写一个简单的 .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文件执行完第一句后就不执行了
关于批处理文件只执行一行的问题

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值