我已经获得以下代码,该代码在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
的旧版本中保存了新代码。
答案 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
)