Назад | Перейти на главную страницу

Добавить, удалить и проверить наличие значения реестра * в командной строке?

Я пытаюсь проверить и обновить сопоставление сетевой зоны в реестре из командной строки. Мне нужно проверить значение с именем *. Например, под HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Internet Settings \ ZoneMap \ Domains \ cmich.local, Редактор реестра показывает следующее:

* REG_DWORD 0x00000001 (1)

Чтобы проверить это значение в командном сценарии (* .cmd), я пытался использовать команду REG QUERY. Когда я пытаюсь сделать это мимо * в качестве значения для сопоставления команда REG QUERY рассматривает звездочку как подстановочный знак и возвращает совпадение, пока существует ключ.

reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Domains\example.com" /v "*" /reg:64

Я пробовал множество комбинаций escape-символов (даже тех, которые, как я был уверен, не сработают), включая все следующие с кавычками и без них: *, \*, ^*, `*, `*`, !*. Ничего из этого не сработало.

Мне также нужно добавлять и удалять значения с именем *, предположительно с REG ADD и REG DELETE.

Как добавить, удалить и проверить наличие значения реестра с именем * в командной строке?

Сложная часть проверки значения реестра с именем * (на самом деле подстановочный знак значения все):

  • запрашивать только односимвольные именованные значения, используя ? подстановочный знак, т.е. максимум один персонаж, и
  • сузить результат до значения с именем * с помощью findstr утилита;
    • на самом деле, reg query "%_TestKey%" /v ? | findstr /I /C:" * REG_" может хватить.

Следующий фрагмент кода пакетного файла показывает, что нет проблем с добавлением, удалением или изменением значения с именем *.

Код прокомментировал с помощью <NUL set /P =::: … трюк т.е. echo ::: … без конца CRLF для вывода комментариев с минимумом пустых строк.

@ECHO ON
@SETLOCAL EnableExtensions DisableDelayedExpansion
@<NUL set /P =::: define a registry key
set "_TestKey=HKEY_CURRENT_USER\Software\Test Key"
@<NUL set /P =::: check all one-character named values 
reg query "%_TestKey%" /v ?
@<NUL set /P =::: narrow above result to the value named * using findstr utility 
reg query "%_TestKey%" /v ? | findstr /I /C:"%_TestKey%" /C:"    *    REG_"
@<NUL set /P =::: delete the value named *
reg delete "%_TestKey%" /v * /f
@<NUL set /P =::: add the value named *
reg add "%_TestKey%" /v * /t REG_DWORD /d 4 /f
@<NUL set /P =::: check the value named * 
reg query "%_TestKey%" /v ? | findstr /I /C:"%_TestKey%" /C:"    *    REG_"
@<NUL set /P =::: change the value named *
reg add "%_TestKey%" /v * /t REG_DWORD /d 1 /f
@<NUL set /P =::: check the value named * 
reg query "%_TestKey%" /v ? | findstr /I /C:"%_TestKey%" /C:"    *    REG_"

Вывод:

==> D:\bat\SF\a867740.bat
::: define a registry key
==> set "_TestKey=HKEY_CURRENT_USER\Software\Test Key"
::: check all one-character named values
==> reg query "HKEY_CURRENT_USER\Software\Test Key" /v ?

HKEY_CURRENT_USER\Software\Test Key
    a    REG_SZ    Latin Small Letter A
    .    REG_SZ    Full Stop
    ?    REG_SZ    Question Mark
    *    REG_DWORD    0x1

End of search: 4 match(es) found.
::: narrow above result to the value named * using findstr utility
==> reg query "HKEY_CURRENT_USER\Software\Test Key" /v ?   | findstr /I /C:"HKEY_CURRENT_USER\Software\Test Key" /C:"    *    REG_"
HKEY_CURRENT_USER\Software\Test Key
    *    REG_DWORD    0x1
::: delete the value named *
==> reg delete "HKEY_CURRENT_USER\Software\Test Key" /v * /f
The operation completed successfully.
::: add the value named *
==> reg add "HKEY_CURRENT_USER\Software\Test Key" /v * /t REG_DWORD /d 4 /f
The operation completed successfully.
::: check the value named *
==> reg query "HKEY_CURRENT_USER\Software\Test Key" /v ?   | findstr /I /C:"HKEY_CURRENT_USER\Software\Test Key" /C:"    *    REG_"
HKEY_CURRENT_USER\Software\Test Key
    *    REG_DWORD    0x4
::: change the value named *
==> reg add "HKEY_CURRENT_USER\Software\Test Key" /v * /t REG_DWORD /d 1 /f
The operation completed successfully.
::: check the value named *
==> reg query "HKEY_CURRENT_USER\Software\Test Key" /v ?   | findstr /I /C:"HKEY_CURRENT_USER\Software\Test Key" /C:"    *    REG_"
HKEY_CURRENT_USER\Software\Test Key
    *    REG_DWORD    0x1