Запрос реестра Windows через пакетный синтаксис - PullRequest
2 голосов
/ 20 сентября 2010

Я пытаюсь выполнить запрос к определенной папке реестра (или как вы хотите ее назвать), чтобы получить некоторую информацию.

В частности, папка HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall содержит список установленного программного обеспечения.

Проблема заключается в том, что каждое программное обеспечение идентифицируется с помощью значения случайного ключа, например {0001B4FD-9EA3-4D90-A79E-FD14BA3AB01D}, а не фактического программного обеспечения (например, Skype).

Это затрудняет поиск идентификатора Skype, потому что мне нужно перебрать все в этой папке Uninstall и проверить, соответствует ли значение DisplayName Skype (или какому-либо другому имени приложения).

Мне нужно использовать пакетный синтаксис ... это то, что я имею до сих пор, но на разных компьютерах он не работает одинаково, возможно, я получаю разные переменные, назначенные на основании некоторого ошибочного форматирования вывода reg?Я не знаю.Могу ли я использовать структуру данных, чтобы содержать любые reg выходные данные?Что-нибудь будет работать.

@echo off
for /f "tokens=*" %%a in ('reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall') do (
    for /f "tokens=2,* delims= " %%b in ('reg query %%a /v Publisher') do (
        IF "%%c" == "Skype Technologies S.A." (
            for /f "tokens=2,* delims= " %%d in ('reg query %%a /v UninstallString') do (
                echo %%e
            )
        )
    )

)

Есть ли более чистый и безопасный способ добиться этого в партии?

Ответы [ 2 ]

3 голосов
/ 21 сентября 2010

Мне кажется, проще использовать

reg QUERY HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall  /f "Skype Technologies S.A." /s

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

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{D103C4BA-F905-437A-8049-DB24763BBE36}
    Publisher    REG_SZ    Skype Technologies S.A.

End of search: 1 match(es) found.
0 голосов
/ 25 июня 2018

Вот пакетный скрипт, который может извлечь строку удаления, например, MsiExec.exe / X [GUID] из ключей реестра x86 / 32bit, а также имя программного обеспечения.Вывод выглядит так.Вы можете добавить свою логику, например, оператор IF для фильтрации и удаления программного обеспечения, если хотите.

Примечание. Не во всех приложениях есть строка MsiExec.exe / X и некоторые значения * 1007.* MsiExec.exe строк содержат MsiExec.exe / I , что означает переустановить его.Они будут заменены на MsiExec.exe / X в сценарии

Удалить ^ | findstr "MsiExec.exe" из приведенного ниже сценария, если вы хотите отобразить ВСЕ32-битные приложения

MsiExec.exe /X{87D50333-E534-493A-8E98-0A49BC28F64B}    SQL Server 2012 Database Engine Services
MsiExec.exe /X{C22613C2-C7A4-4761-A906-116ECD4E7477}    SQL Server 2012 Database Engine Services
MsiExec.exe /X{8BC3EEC9-090F-4C53-A8DA-1BEC913040F9}    Microsoft .NET Framework 4.6.1 Targeting Pack
MsiExec.exe /X{8C5FB518-E78C-F8F0-BFEC-8EAC65F51003}    Windows Assessment Services - Client (Client SKU)
MsiExec.exe /X{90160000-008C-0000-0000-0000000FF1CE}    Office 16 Click-to-Run Extensibility Component
MsiExec.exe /X{90160000-008C-0409-0000-0000000FF1CE}    Office 16 Click-to-Run Localization Component
MsiExec.exe /X{91361B2A-F741-E591-303B-4EF957F3BAF1}    Windows Assessment Toolkit (AMD64 Architecture Specific)


@echo off
setlocal ENABLEDELAYEDEXPANSION

set x86GUID=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall
for /f "tokens=2*" %%A in (
  'reg query "%x86GUID%" /V /F DisplayName /S /E 2^>nul ^| findstr "DisplayName"'
) do (
  for /f "delims=" %%P in ('reg query "%x86GUID%" /s /f "%%B" 2^>nul ^| findstr "HKEY_LOCAL_MACHINE"') do (
    for /f "tokens=2*" %%X in (
      'reg query "%%P" /v "UninstallString" 2^>nul ^|findstr "UninstallString" ^|findstr "MsiExec.exe"'
    ) do (
      set MsiStr=%%Y
      set MsiStr=!MsiStr:/I=/X!
      echo !MsiStr! %%B
    )
  )
)
...