在循环内显示 DelayedExpansion 变量

Displaying DelayedExpansion variables inside a loop

我得到了以下代码,它在 SpecialUserRegDir 的键中查找并打印出 DWORD 类型的值。此代码的次要部分是一个数字,它会随着每次迭代而增加。不幸的是,我找不到访问变量的方法,这些变量似乎计算正确。

@echo OFF
@setlocal EnableExtensions  EnableDelayedExpansion

set SpecialUserRegDir=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
set number=0
set /a number+=1

REG QUERY "%SpecialUserRegDir%" /s | for /F %%f in ('findstr "REG_DWORD"') do @( 
    set /a number+=1        :: Output: Values I need (2,3 etc)
    @Echo !number!          :: Output: !number!
    @Echo %number%          :: Output: 1
    @echo %%f               :: Output: [name of registry value]
)
@Echo !number!              :: Output: 1
@Echo %number%              :: Output: 1

注册表部分不是那么重要,因为它可以工作。我想知道是否有办法保持循环结构并从循环内访问 number 的值。

编辑:只有 1 个输出更改为新代码:

for /F %%f in ('REG QUERY "%SpecialUserRegDir%" /s ^| findstr "REG_DWORD"') do ( 
            set /a number+=1        :: Output: Values I need (2,3 etc)
            @Echo !number!          :: Output: !number!
            @Echo %number%          :: Output: 1
            @echo %%f               :: Output: [name of registry value]
        )
        @Echo !number!              :: Output: 4 (correct, because there are 3 values)
        @Echo %number%              :: Output: 1 (expected....)

编辑 2:忽略第一个编辑。我有多个打开代码的记事本,并在没有 EnableDelayedExpansion.

的情况下将新代码保存在旧版本上

你的问题出在管道上,因为这禁用延迟扩展!
为什么?
一个管道创建两个 cmd.exe 的新实例,它们都具有默认设置(禁用延迟扩展,...)并且它在命令行上下文中运行,它的工作方式不同于批处理上下文。

您可以通过将管道移动到 for 循环中来轻松解决这个问题。
然后你也可以去掉@标志。

...
for /F %%f in ('REG QUERY "%SpecialUserRegDir%" /s ^| findstr "REG_DWORD"') do ( 
    set /a number+=1        :: Output: Values I need (2,3 etc)
    Echo !number!          :: Output: !Iterator!
    Echo %number%          :: Output: 1
    echo %%f               :: Output: [name of registry value]
)

^| 是强制 FOR 循环内的管道功能所必需的,否则批处理解析器会在管道字符处拆分行并失败。

下一个问题是您的 FOR/F 无法通过这种方式获取注册表值。
您需要添加 tokens 选项才能访问第 n 个元素。

for /F "tokens=1-3" %%A in ('REG QUERY "%SpecialUserRegDir%" /s ^| findstr "REG_DWORD"') do ( 
  echo key=%%A type=%%B value=%%C
)