Sprawdzanie istnienia wartości klucza rejestru dla partii pętli

4

Piszę skrypt wsadowy, aby sprawdzić, czy istnieje wartość klucza rejestru i mam pewne problemy. Kiedy bezpośrednio określę klucz do wyszukania, %ERRORLEVEL% aktualizuje się odpowiednio. Poniższy przykład odzwierciedla wartość 1 zgodnie z oczekiwaniami.

REG QUERY HKLM /v NONEXISTENT_KEY
ECHO %ERRORLEVEL%

Sprawdzam jednak istnienie wiązki kluczy w pliku, więc zapętlam go FOR. Następujące echo 0 z jakiegoś powodu, którego nie rozumiem.

FOR /F "tokens=1-2 delims=," %%A IN (myFile.txt) DO (
    REG QUERY "%%A" /v "%%B"
    ECHO %ERRORLEVEL%

Uwaga: strukturę pliku, który zapętlam, pokazano w następującym przykładzie:

HKEY_LOCAL_MACHINE\PATH\TO\KEY,SOME VALUE
Alex Eshoo
źródło
Próbowałeś użyć Setlocal EnableDelayedExpansion razem z ECHO !ERRORLEVEL!?
DavidPostill
Po prostu spróbowałem tego, poziom błędu jest nadal zwracany jako 0, mimo że wartość klucza nie istnieje.
Alex Eshoo
EDYTOWAĆ Przepraszamy, ale zapomniałem zmienić moje '%' na '!' Działa po tym.
Alex Eshoo
Tak, właśnie potwierdzone testami. Pisanie odpowiedzi.
DavidPostill

Odpowiedzi:

1

Następujące echo s 0 z jakiegoś powodu nie rozumiem.

FOR /F "tokens=1-2 delims=," %%A IN (myFile.txt) DO (
    REG QUERY "%%A" /v "%%B"
    ECHO %ERRORLEVEL%

Musisz EnableDelayedExpansion razem i używać ECHO !ERRORLEVEL!.

Poprawiony plik wsadowy:

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1-2 delims=," %%A IN (myFile.txt) DO (
    REG QUERY "%%A" /v "%%B"
    ECHO !ERRORLEVEL!
  )
endlocal

Wydajność:

> type myFile.txt
HKEY_LOCAL_MACHINE\PATH\TO\KEY,SOME VALUE

> test
ERROR: The system was unable to find the specified registry key or value.
1

Dalsze czytanie

DavidPostill
źródło
Jaka jest rola EnableDelayedExpansion? Nie mogę zrozumieć z ss64, możesz to wyjaśnić?
Biswapriyo
@Biswa W pętli należy użyć opóźnionego rozszerzenia, aby ocenić wartość zmiennych za każdym razem, gdy wykonywana jest pętla. Bez opóźnionego rozszerzania jest on oceniany tylko raz, gdy plik wsadowy jest analizowany (co się dzieje, gdy jest odczytywany).
DavidPostill