2016-05-11 3 views
3

У меня есть следующий код, который находит и распечатывает значения типа DWORD внутри ключа в SpecialUserRegDir. Вторичная часть этого кода - это число, которое просто увеличивается с каждой итерацией. К сожалению, я не могу найти способ доступа к переменным, которые, похоже, правильно вычисляются.Отображение переменных DelayedExpansion внутри цикла

@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 из цикла.

EDIT: Только один из выходов изменены с новым кодом:

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....) 

EDIT 2: Не обращайте внимания на первое редактирование. У меня было несколько блокнотов с открытым кодом и сохранили новый код в старой версии без EnableDelayedExpansion.

ответ

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/F не может получить значение реестра таким образом.
Вам нужно добавить опции токенов для доступа к n-му элементу.

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

Я пробовал этот код. Номер после цикла! теперь получает правильную информацию, но внутренняя часть цикла совсем не изменилась. Хотя, я думаю, я понимаю вопрос, который вы указали, я буду экспериментировать немного завтра и посмотреть, как это получается. – Zero

+0

Я добавил объяснение вашей второй проблемы (отсутствующая опция токена) – jeb

Смежные вопросы