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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.