Windows 批处理脚本行似乎被截断

Windows 批处理脚本行似乎被截断,windows,batch-file,Windows,Batch File,对于我的构建系统,如果任何构建脚本发生更改,我将导出一个批处理文件以重新生成构建图。批处理脚本未按预期运行,命令似乎被截断或一分为二 @cd C:\Users\niklas\Repositories\craftr-build\craftr4 @call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --project C:\Users\niklas\Repo

对于我的构建系统,如果任何构建脚本发生更改,我将导出一个批处理文件以重新生成构建图。批处理脚本未按预期运行,命令似乎被截断或一分为二

@cd C:\Users\niklas\Repositories\craftr-build\craftr4
@call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --project C:\Users\niklas\Repositories\craftr-build\craftr4\examples\c\build.craftr --variant debug -Oninja:_internal_regen=true -Oninja:_internal_regen=true -Oninja:_internal_regen=true -Oninja:speed=true --project examples/c\build.craftr --build-root build --pywarn none
@if %errorlevel% neq 0 exit %errorlevel%
这给了我

[.. output of command, WITH the flags below ..]
C:\Users\niklas\Repositories\craftr-build\craftr4>ld-root build --pywarn none
'ld-root' is not recognized as an internal or external command,
operable program or batch file.
--build root build--pywarn none
选项实际上是传递给命令的,但出于某种原因,批处理程序尝试将
ld root build--pywarn none
作为命令运行。为什么呢


更新:似乎是
-O..
标志中的双冒号有问题。用另一个字符替换这些双冒号会使它“起作用”(显然,该命令不正确,但批处理会按预期执行)

在参数周围添加双引号没有帮助


更新:批处理是一个谜——由于某种原因,现在我确保没有多次添加
-Oninja:\u internal\u regen=true
标志,并删除了第一个
--project…
参数(该参数也被错误添加)


更新:在进行更多的实验时,我发现了另一种奇怪的行为。以下各项运行良好:

cd C:\Users\niklas\Repositories\craftr-build\craftr4
call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=true --project examples/c\build.craftr
if %errorlevel% neq 0 exit %errorlevel%
并给予

C:\Users\niklas\Repositories\craftr-build\craftr4>cd C:\Users\niklas\Repositories\craftr-build\craftr4

C:\Users\niklas\Repositories\craftr-build\craftr4>call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=false --project examples/c\build.craftr
Microsoft Visual C++ v141 (msvc) 19.14.26433 for x64
note: writing "C:\Users\niklas\Repositories\craftr-build\craftr4\build\debug\build.ninja"

C:\Users\niklas\Repositories\craftr-build\craftr4>\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\aliases\craftr.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\ninja_syntax.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\build_server.py C:\Users\niklas\Repositories\craftr-build\craftr4\examples\c\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\aliases\cxx.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\impl\base.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\impl\msvc.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\msvc.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.tool\batchvars.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.tool\cache.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\llvm.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\mingw.craftr OUTPUTS: C:\Users\niklas\Repositories\craftr-build\craftr4\build\debug\build.ninja COMMAND: c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=false --project examples/c\build.craftr

C:\Users\niklas\Repositories\craftr-build\craftr4>if 0 NEQ 0 exit 0
但是将
-Oninja:_internal\u regen=true
更改为
-Oninja:_internal\u regen=false
,它就会崩溃

C:\Users\niklas\Repositories\craftr-build\craftr4>cd C:\Users\niklas\Repositories\craftr-build\craftr4

C:\Users\niklas\Repositories\craftr-build\craftr4>call c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=false --project examples/c\build.craftr
Microsoft Visual C++ v141 (msvc) 19.14.26433 for x64
note: writing "C:\Users\niklas\Repositories\craftr-build\craftr4\build\debug\build.ninja"

C:\Users\niklas\Repositories\craftr-build\craftr4>\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\aliases\craftr.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\ninja_syntax.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.backend\ninja\build_server.py C:\Users\niklas\Repositories\craftr-build\craftr4\examples\c\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\aliases\cxx.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\build.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\impl\base.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.lang\cxx\impl\msvc.py C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\msvc.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.tool\batchvars.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.tool\cache.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\llvm.craftr C:\Users\niklas\Repositories\craftr-build\craftr4\src\craftr\stdlib\net.craftr.compiler\mingw.craftr OUTPUTS: C:\Users\niklas\Repositories\craftr-build\craftr4\build\debug\build.ninja COMMAND: c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe -m craftr.main -c --variant debug -Oninja:speed=true -Oninja:_internal_regen=false --project examples/c\build.craftr

C:\Users\niklas\Repositories\craftr-build\craftr4>if 0 NEQ 0 exit 0

注意第三个呼叫是如何垃圾的。

在没有呼叫的情况下尝试一下

@echo off
cd "C:\Users\niklas\Repositories\craftr-build\craftr4"
"c:\users\niklas\repositories\craftr-build\craftr4\.venv\scripts\python.exe" -m craftr.main -c --project "C:\Users\niklas\Repositories\craftr-build\craftr4\examples\c\build.craftr" --variant debug -Oninja:_internal_regen=true -Oninja:_internal_regen=true -Oninja:_internal_regen=true -Oninja:speed=true --project examples/c\build.craftr --build-root build --pywarn none

事实证明,这与批处理语法无关,但从批处理文件运行的命令实际上会重写批处理文件本身的内容


确保文件在执行过程中未被覆盖可以使其正常工作。每次调用时,我通过在两个不同的文件名之间“乒乓”解决了这个问题(调用者也知道要调用的正确文件)。

我有点困惑,因为这是可行的——但出于某种原因,我发布的最初代码片段也可行-不管怎样,我添加了另一个更新,在那里我发现了一个小小的改变,使它变得混乱,从批处理文件运行的命令实际上重写了批处理文件。这可能是个问题吗?批处理文件的名称是什么?希望与文件中的任何命令都不一样。好的,我想我找到了。对批处理文件进行乒乓处理似乎有效。即,生成系统生成一个文件
…regen\u ping.bat
。如果调用该批处理文件,其目标将是重写该批处理文件。但这次它生成了一个文件
…regen_pong.bat
。下一次,它将生成
…regen_ping.bat
,依此类推。通过这种方式,我们确保从批处理文件运行的命令不会重写批处理文件本身。好的,我正要这么说,但是,请去掉
call
。。按照我的例子使用它。虽然可以成功地完成,但动态修改批处理脚本很少是一个好的解决方案。几乎总是有更好的方法来解决这个问题。