如何从 Windows Batch 子例程调用 SCons?
Posted
技术标签:
【中文标题】如何从 Windows Batch 子例程调用 SCons?【英文标题】:How to call SCons from a Windows Batch subroutine? 【发布时间】:2016-10-14 12:52:24 【问题描述】:我正在尝试编写一个执行几个 SCons 命令的 .bat 文件,但我发现一旦执行第一个命令,bash 就会关闭而不执行其他命令。
于是我做了一个子程序,使用CALL命令:
call :my_subroutine
pause
exit /b
:my_subroutine
scons platform=windows -c
exit /b
虽然这个子例程在内部带有echo "test"
时正确执行,但我一输入 scons 命令,控制台就说找不到名为 my_subroutine
的命令文件...
D:\...\godot>call :my_subroutine
D:\...\godot>scons platform=windows -c
Le système ne trouve pas le nom de fichier de commandes - my_subroutine
D:\...\godot>pause
Appuyez sur une touche pour continuer...
英文留言:
The system doesn't finds the name of the commands file - my_subroutine
[...]
Press a key to continue...
【问题讨论】:
你能把上面的信息翻译成英文吗?尤其是在它调用 scons 之后的那个? 我在第一篇文章中翻译了。 scons.bat 在你的 PATH 中吗? 是的,它无需使用子程序即可工作。 如果您将完整路径放入并包含 .bat 扩展名怎么办? 【参考方案1】:尝试使用 call scons platform=windows -c
【讨论】:
提示:您可以将代码格式化为代码,方法是将其括在``
中,或者将其缩进四个空格以使您的帖子更具可读性。【参考方案2】:
这种行为是因为 Windows 试图跳到 scons.bat
中的 :my_subroutine
子例程。
可以用下面这对批处理文件重现这种情况:
test.bat
rem test.bat :start
call :my_subroutine
exit /b
:my_subroutine
rem test.bat :my_subroutine
test2
exit /b
test2.bat
rem test2.bat :start
exit /b
:my_subroutine
rem test2.bat :my_subroutine
echo wtf
产生以下输出:
>test
>rem test.bat :start
>call :my_subroutine
>rem test.bat :my_subroutine
>test2
>rem test2.bat :my_subroutine
>echo wtf
wtf
>exit /b
呼叫帮助页面指出:
CALL 命令现在接受标签作为 CALL 的目标。语法 是:
CALL :label arguments
使用指定的参数创建一个新的批处理文件上下文,并且 控制被传递给指定标签之后的语句。
似乎即使在调用单独的批处理文件后,这种行为仍会继续。
要绕过此问题从批处理文件中调用 scons.bat,解决方案是(正如 Guillermo Meza Lopez 所说)使用调用:
call scons platform=windows -c
【讨论】:
【参考方案3】:实现这项工作的另一种方法是显式调用 python 脚本。
python <path to scons.py> platform=windows -c
【讨论】:
【参考方案4】:在此线程中找到了解决此问题的方法:Why does only the first line of this Windows batch file execute but all three lines execute in a command shell?
例如,如果您有 build32.bat 和 build64.bat,您要构建的 bat 文件应如下所示:
build32.bat & ^
build64.bat
如果要在出现错误时停止运行,请使用 && ^ 代替 & ^。
【讨论】:
以上是关于如何从 Windows Batch 子例程调用 SCons?的主要内容,如果未能解决你的问题,请参考以下文章