为什么如果我在FOR处理的项目中放入奇数的%s,命令会退出脚本?

npo*_*aka 5 batch-file

这是一个例子:

@echo off
for /f %%# in ('rem %')  do echo %%#
echo never displayed
Run Code Online (Sandbox Code Playgroud)

(并且输出与此示例略有不同 - 生成一个空行少 - 尽管脚本应该执行相同的操作)

@echo off

for /f %%# in ('rem %')  do echo %%#
echo never displayed
Run Code Online (Sandbox Code Playgroud)

如果DO块中没有令牌,则没有问题:

@echo off
for /f %%# in ('rem %')  do dir
echo will be displayed
Run Code Online (Sandbox Code Playgroud)

看起来脚本尝试在遇到时扩展一些变量,%但是它被闭括号中断?

MC *_* ND 5

尝试解释该行时,它是一个解析器错误

for /f %%# in ('rem %') do echo %%#
                    ^...........^
                    undefined variable

for /f %%# in ('rem %') do dir
                    ^
                    without a closing percent sign, it is discarded
Run Code Online (Sandbox Code Playgroud)

试试(这个失败了)

for /f %%# in ('echo yes ^& rem %') do echo %%#
Run Code Online (Sandbox Code Playgroud)

现在有了

set "') do echo =') do echo %%"
for /f %%# in ('echo yes ^& rem %') do echo %%#
echo displayed
Run Code Online (Sandbox Code Playgroud)

经过一些测试之后编辑似乎问题与for命令没有关系,而是搜索一个右边的右括号,它以错误的错误处理结束,丢弃在非封闭代码块中解析的所有命令.

这个批处理文件(那些是其中的所有行)

if 1==1 (
    for %a in (test) do echo %%a
Run Code Online (Sandbox Code Playgroud)

将失败,语法错误(%a)显示解析器正在处理它,但如果错误得到纠正

if 1==1 (
    for %%a in (test) do echo %%a
Run Code Online (Sandbox Code Playgroud)

批次结束没有任何错误

只是一个简单的批处理,没有iffor解析器的差异,行为相同

( echo test
Run Code Online (Sandbox Code Playgroud)