bat运行时,即使使用了pause也无法阻止程序不退出的解决方法

Windows下使用bat批处理文件时发现一个奇怪的现象,比如bat文件运行到使用conda激活环境后,程序会直接退出,不会运行之后的指令。
比如我的bat文件长这样:

set PYTHONPATH=.
conda activate rlearn
python xxx.py
pause

但实际上程序运行到conda activate rlearn就会退出了。解决这种跟conda有关的方案可以参考这篇博客,其实就是在调用conda命令时使用call指令。

为了更加广泛地调试这种pause不起作用导致无法判断程序运行出现了什么问题的情况,可以在bat开头加上这么一句指令:

if not defined in_subprocess (cmd /k set in_subprocess=y ^& %0 %*) & exit )

此指令的作用如下:
当你运行这个脚本时:
初始窗口会检测到 in_subprocess 未定义,启动一个新的命令行窗口,设置 in_subprocess 为 y,并递归调用自己。
新的窗口会执行后续的命令,并保持打开状态,允许用户查看输出。

具体解析:

  1. if not defined in_subprocess:
    • 检查环境变量 in_subprocess 是否未定义。
    • not defined 是一个条件,如果变量 in_subprocess 未定义,则条件为真。
  2. (cmd /k set in_subprocess=y ^& %0 %*):
    • 如果 in_subprocess 未定义,则执行括号中的命令。
    • cmd /k:启动一个新的命令行窗口并执行后续命令。/k 参数表示在执行完命令后保持命令行窗口打开。
    • set in_subprocess=y:在新窗口中设置环境变量 in_subprocess 为 y。
    • ^&:这是一个转义字符组合,表示逻辑 AND,用于将多个命令组合在一起。在批处理文件中,^ 用于转义特殊字符。
    • %0 %*:%0 表示当前批处理文件的名称,%* 表示传递给批处理文件的所有参数。这部分用于递归调用当前批处理文件,并传递原始的所有参数。
  3. & exit:
    • & 是一个命令分隔符,用于在当前行中将多个命令串联在一起。
    • exit 命令用于退出当前批处理文件。
  4. ):
    • 结束 if 语句的条件块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值