批处理文件中的括号

Lau*_*arn 1 batch-file parentheses

这段代码的括号出现了奇怪的事情:

Setlocal EnableDelayedExpansion
MyFOLDER=
FOR %%B IN (c,d,e,f,g) DO (@%%B: 2>nul && set z=%%B <nul if exist %z%\
(if %MYFOLDER%==[] (echo %z%
)
)
)
Run Code Online (Sandbox Code Playgroud)

以上编译,但这不是:

Setlocal EnableDelayedExpansion
MyFOLDER=
FOR %%B IN (c,d,e,f,g) DO (@%%B: 2>nul && set z=%%B <nul if exist %z%\
(if %MYFOLDER%==[] (
echo %z%
)
)
)
Run Code Online (Sandbox Code Playgroud)

也不是这个

Setlocal EnableDelayedExpansion
MyFOLDER=
FOR %%B IN (c,d,e,f,g) DO (@%%B: 2>nul && set z=%%B <nul if exist %z%\
(if %MYFOLDER%==[]
(
echo %z%
)
)
)
Run Code Online (Sandbox Code Playgroud)

也不是"echo%z%"低于(如果是MYFOLDER)行的任何其他组合."FOR"行中有什么可疑的吗?

moj*_*ojo 5

尽管不了解目标,但我看到了一些问题.

您可以使用SET(例如SET MyFolder=)定义变量.在Unix shell中,你只是说MyFOLDER=,但不是在CMD中.

IFMyFolder中的比较(这应该做到===)可能是毫无意义的,因为你不是在将使用变量的内容的方式这样做.您只是将文字字符串MYFOLDER与文字字符串进行比较[].此比较将始终为false,并且在整个脚本执行过程中永远不会更改.

您正在转让括号(这是所有评估一次的全部内容,包括正常的变量替换),然后尝试访问相同的"块"的内部变量(CMD确实没有明确的语法,但它至少类似于一个块).将要发生的是,%z%将在评估时(...)评估它,并且在此脚本中,它将为空并且替换为空.随后IF EXIST将吃下你给它的下一个东西,这是括号表达式.我无法预测那里会发生什么.

我不知道为什么你分配%%Bz,然后用z一个比较.为什么不用%%B%%B至少会使用延迟扩张.

您已启用延迟扩展,但尚未使用它(除了FOR您打开延迟扩展时始终延迟的变量除外).要使用延迟扩展,您必须使用bangs(!)而不是正常的percent(%)来包围变量.因此,在z或者MYFOLDER,它将分别成为!z!!MYFOLDER!.如果为同一块中的变量赋值,则以这种方式访问​​变量在括号"块"内是绝对必要的.

我会提供你的剧本的修订版,但是我太沉闷了,无法理解你想要完成的任务.