2016-05-11 5 views
3

私はDWORD型の値を見つけ出してキーの中でSpecialUserRegDirに出力する次のコードを持っています。このコードの2番目の部分は、各反復で単純に増加する数値です。残念ながら、正しく計算されているように見える変数にアクセスする方法を見つけることができません。ループ内に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:出力のみ1は、新しいコードを変更最初の編集を無視します。私はコードを開いて複数のメモ帳を持っていたし、EnableDelayedExpansionなしで古いバージョンに新しいコードを保存した。

答えて

4

あなたの問題はパイプで、は無効になります遅延拡張!
なぜですか?
パイプは、既定の設定(遅延展開が無効になっています...)の両方で、cmd.exeの2つの新しいインスタンスを作成し、バッチコンテキストとは異なる動作をするコマンドラインコンテキストで実行します。

パイプを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ループ内パイプfunctionallityを強制する必要があります。

次の問題は、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

2番目の問題の説明を追加しました(トークンオプションがありません) – jeb

関連する問題