如何从 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?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 从 dll 调用 FORTRAN 子例程

从 C++ 调用带有可选参数的 Fortran 子例程

从 C++ 调用带有可选参数的 Fortran 子例程

如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数

从 VBA 中的不同模块调用子例程

如何在远程主机上调用 perl 子例程(可能通过系统命令)?