Batch file for循环中的延迟扩展

Batch file for循环中的延迟扩展,batch-file,cypress,Batch File,Cypress,延迟扩展在我的for循环中表现得很奇怪。在第一次迭代中定义了study,在第二次迭代中,延迟扩展似乎不起作用(延迟扩展仅用于去掉冒号,因为这将是目录的名称)。这就像是命令破坏了某些东西。这是否与cypress CLI的工作方式有关,或者我的脚本有问题 @echo off setlocal EnableExtensions EnableDelayedExpansion :parse IF "%~1"=="" GOTO endparse IF &qu

延迟扩展在我的for循环中表现得很奇怪。在第一次迭代中定义了
study
,在第二次迭代中,延迟扩展似乎不起作用(延迟扩展仅用于去掉冒号,因为这将是目录的名称)。这就像是命令破坏了某些东西。这是否与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“第一次研究:第1章,第二次研究:第3章”

控制台输出:

study firstStudy:Chap1 delayedExString firstStudyChap1
[...cypress log...]


study secondStudy:Chap3 delayedExString !study!
[...cypress log...]


如您所见,在第二次迭代中,研究没有展开。

后续迭代中不同行为的一个根本原因是批处理解析器退出到命令行解析器

这在循环中发生,方法是在不调用
的情况下启动另一个批处理文件
我想在你的情况下是npx

要解决这个问题,只需添加
CALL

call npx cypress run ...
在不调用
的情况下启动另一个批处理文件会导致将执行上下文传输到另一个批处理文件而不返回。
通常,在第二个批处理文件结束并返回到命令行上下文后,这将导致结束。
但在循环中,循环仍然会完成

对此行为的一个简单检查是添加一个伪函数调用

for %%a in ("%studies:,=" "%") do (
   call :dummy
   ....
)

:dummy
exit /b
第一个循环工作,但随后出现错误:

在批处理脚本外部调用批处理标签的尝试无效


回声“%studies:,=”“%”的输出是什么?或者如果您在循环中添加一个
echo“%%~na”
,我看不出您提供的代码有任何错误,与该示例输入一起使用,这将导致该错误。但是,对于不同的
-s
参数输入,可能存在一些小问题。请确认您确实提供了一个示例输入命令和参数字符串,但该字符串在该代码中失败。因此,显然
cypress
会在内部启动另一个批处理(子流程?)。这就解决了问题。谢谢