延迟扩展在我的 for 循环中表现得很奇怪。在第一次迭代中定义了 study
,在第二次迭代中延迟扩展似乎不起作用(延迟扩展只是用来去掉冒号,因为那将是目录的名称)。就是这样cypress命令破坏了一些东西。这与 cypress CLI 的工作方式有某种关系,还是我的脚本有问题?
@echo off
setlocal EnableExtensions EnableDelayedExpansion
:parse
IF "%~1"=="" GOTO endparse
IF "%~1"=="-s" SET studies=%~2
SHIFT
GOTO parse
:endparse
for %%a in ("%studies:,=" "%") do (
set tmp=%%~na
set study=!tmp::=!
echo study %%~a delayedExString: !study!
npx cypress run -study=%%~a --config videosFolder=cypress/videos/!study! --headless --spec "cypress/integration/*"
)
例子:
myscript.bat -s "firstStudy:Chap1,secondStudy:Chap3"
控制台输出:
study firstStudy:Chap1 delayedExString firstStudyChap1
[...cypress log...]
study secondStudy:Chap3 delayedExString !study!
[...cypress log...]
如您所见,在第二次迭代中研究没有展开。
最佳答案
后续迭代中不同行为的一个根本原因是批解析器退出到命令行解析器。
这发生在循环内部,通过在没有 CALL
的情况下启动另一个批处理文件。
我想你的情况是 npx
。
要解决这个问题,只需添加CALL
call npx cypress run ...
在没有 call
的情况下启动另一个批处理文件会导致将执行上下文传输到另一个批处理文件而不返回。
通常这会在第二个批处理文件结束并返回到命令行上下文后结束。
但是在一个循环中,循环还是会完成。
对此行为的简单检查是添加一个虚拟函数调用。
for %%a in ("%studies:,=" "%") do (
call :dummy
....
)
:dummy
exit /b
第一个循环有效,但随后发生错误:
Invalid attempt to call batch label outside of batch script.
关于batch-file - for循环中的延迟扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67886745/