在循环内显示DelayedExpansion变量

时间:2016-05-11 12:22:48

标签: batch-file arithmetic-expressions

我已经获得以下代码,该代码在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的值。

编辑:只有一个输出更改了新代码:

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的旧版本中保存了新代码。

1 个答案:

答案 0 :(得分:4)

你的问题是管道,因为这个禁用延迟扩展!
为什么呢?
管道使用默认设置(禁用延迟扩展,...)创建两个新的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无法通过这种方式获取注册表值 您需要添加令牌选项以访问第n个元素。

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