Алгоритм для определения, установленная ли программа в системе

Вопрос или проблема

У меня есть программа, которая утверждает, что определяет, установлена ли DOSBOX в системе, независимо от местоположения папки с исполняемым файлом.

@echo off
setlocal EnableDelayedExpansion

echo Поиск DOSBox

REM Поиск в 32-битном реестре
set "FOUND=0"
for /f "tokens=2 delims==" %%a in ('wmic product where "name like '%%DOSBox%%'" get name /value 2^>nul') do (
    echo DOSBox найден: %%a
    set "FOUND=1"
)

REM Поиск в 64-битном реестре
if %FOUND%==0 (
    for /f "tokens=2 delims==" %%a in ('wmic product where "name like '%%DOSBox%%'" get name /value 2^>nul') do (
        echo DOSBox найден: %%a
        set "FOUND=1"
    )
)

REM Дополнительный поиск по частичному названию
if %FOUND%==0 (
    for /f "tokens=2 delims==" %%a in ('wmic product where "name like '%%DOS%%'" get name /value 2^>nul') do (
        echo Возможно, найден DOSBox: %%a
        set "FOUND=1"
    )
)

if %FOUND%==0 (
    echo DOSBox НЕ установлен в системе.
) else (
    echo DOSBox УСТАНОВЛЕН в системе.
)

pause

Проблема в том, что он всегда говорит, что он не установлен, когда он установлен. Как я могу исправить алгоритм, чтобы он всегда давал правильный ответ?

Ответ или решение

Для разработки алгоритма, способного точно определить, установлен ли DOSBox на системе, необходимо правильно использовать средства Windows Management Instrumentation (WMI) и учесть возможные ошибки в текущем коде. В этом ответе мы разберем ваш текущий скрипт, выявим возможные проблемы, и предложим оптимизированный алгоритм.

Проблемы текущего алгоритма

  1. Ошибки в проверке реестра: Если в системе установлена 64-разрядная версия DOSBox, и вы проверяете 32-разрядный реестр (или наоборот), это может привести к неверным результатам. В Windows структуры реестра различаются для 32- и 64-разрядных приложений.

  2. Правильное использование переменной FOUND: В текущем коде логика проверки переменной FOUND может быть непрозрачной из-за многоуровневого условия.

  3. Проблема с форматом вывода: Вывод команды wmic может различаться в зависимости от версии Windows, что также может влиять на результаты.

Оптимизированное решение

@echo off
setlocal EnableDelayedExpansion

echo Поиск DOSBox...

REM Изначально определяем, что программа не найдена
set "FOUND=0"

REM Проверка реестра 32-битных и 64-битных приложений
for %%i in (32 64) do (
    for /f "tokens=*" %%a in ('reg query "HKLM\SOFTWARE\%%i\Microsoft\Windows\CurrentVersion\Uninstall" /s ^| findstr /i "DOSBox"') do (
        echo DOSBox найден: %%a
        set "FOUND=1"
    )
)

REM Проверка наличия по частичному имени
if !FOUND! == 0 (
    for /f "tokens=*" %%a in ('reg query "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" /s ^| findstr /i "DOS"') do (
        echo Возможен DOSBox: %%a
        set "FOUND=1"
    )
)

REM Сообщение о результате
if !FOUND! == 0 (
    echo DOSBox НЕ установлен на системе.
) else (
    echo DOSBox установлен на системе.
)

pause

Подробный разбор

  1. Использование reg query: Вместо wmic product, который может быть не доступен или возвращать некорректную информацию, мы используем reg query. Это дает более точные результаты по установленным приложениям, так как информация о каждом установленном программном обеспечении хранится в реестре.

  2. Упрощение структуры логики: Логика определения переменной FOUND теперь более ясная и последовательная, что позволяет избежать путаницы и лишних проверок.

  3. Проверка на 32-битные и 64-битные приложения: Мы проверяем оба пути реестра, что гарантирует, что мы охватываем все возможные установки DOSBox.

Заключение

Данный алгоритм принципиально изменяет подход к определению установленного программного обеспечения, делая его более надежным и точным. Рекомендуется протестировать скрипт в разных версиях Windows, чтобы убедиться в совместимости и эффективности. С учетом предложенных улучшений, вы сможете убедиться в том, что скрипт всегда правильно определяет наличие DOSBox на системе, минимизируя риск ошибок.

Оцените материал
Добавить комментарий

Капча загружается...