Windows批处理脚本多行poetry命令在部分设备执行中断问题咨询
问题根因判定
该问题既不是Windows版本差异、硬件资源问题,也不是编码/不可见字符问题,核心原因是设备1上安装的poetry以批处理脚本(.bat/.cmd)作为启动入口,而非独立exe可执行文件。
原理说明
Windows批处理(.bat/.cmd)的执行逻辑中存在如下规则:
- 如果在父脚本中直接调用另一个批处理文件(无
call关键字),执行完子批处理后,cmd会直接终止整个父脚本进程,不会继续执行父脚本后续的命令 - 如果在同一行用
&拼接多个命令,cmd会将整行识别为单条命令单元,调用子批处理完成后会继续执行同一行内剩余的拼接命令 - 如果调用的是exe格式的可执行文件,cmd执行完exe后会默认回到父脚本,继续执行后续命令
两台设备的表现差异完全符合该规则:
- 设备2的poetry安装时生成的是exe启动入口,所以分行执行所有poetry命令都正常
- 设备1的poetry启动入口是bat/cmd格式,分行执行第一条poetry命令(子批处理)后,父脚本直接终止,后续命令无法运行;用&拼接为单行后,整行命令会被连续执行,所以能正常跑完
验证方案
你可以通过以下操作确认问题:
- 检查设备1的poetry可执行文件路径:在cmd中执行
where poetry,查看返回的文件后缀是不是.bat或.cmd - 不修改命令拼接方式,在原脚本的每一行poetry命令前增加
call关键字,修改后如下:
cd C:\my_project\ git pull set ENV=prod set USERNAME=me call poetry config virtualenvs.create false call poetry install call poetry run python -m my_module
如果修改后分行执行也能正常跑完,即可完全确认根因。
内容的提问来源于stack exchange,提问作者Sergio Lema
相关产品推荐
相关产品推荐

