批处理脚本行似乎被截断

问题描述 投票:-1回答:2

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

@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:_internal_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_regen=true改为-Oninja:_internal_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

注意第三个调用是垃圾。

windows batch-file
2个回答
0
投票

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

确保文件在执行时不被覆盖使其工作。每次调用它时,我通过两个不同文件名之间的“ping-ponging”来解决它(调用者也知道要调用的正确文件)。


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
© www.soinside.com 2019 - 2024. All rights reserved.