在循环内显示 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
)
我得到了以下代码,它在 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
)