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

Проблема уровня ошибки пакетного сценария с ключом реестра

Приведенный ниже сценарий был написан, чтобы проверить, установлен ли teamviewer или нет, и для какой архитектуры он получит его ClientID, преобразует его в десятичное и распечатает в файл.

Каждый раз, независимо от того, установлен он или нет, результатом этого сценария будет «Teamviewer не установлен».

Я не нашел в этом скрипте никаких ошибок логики.

reg query "HKLM\Software\TeamViewer" /v "ClientID"
    if %ERRORLEVEL% == 1 (
        reg query "HKLM\Software\Wow6432Node\TeamViewer" /v "ClientID"
            if %ERRORLEVEL% == 1 (
                echo TEAMVIEWER NOT INSTALLED >> %computername%.nfo
            ) else (
                for /f "tokens=3" %%a in ('reg query "HKLM\Software\Wow6432Node\TeamViewer" /v "ClientID"') do (
                    set /a decimal=%%a + 0
                    echo TEAMVIEWER ID: >> %computername%.nfo
                    echo %decimal% >> %computername%.nfo
                )
            )
    ) else (
        for /f "tokens=3" %%a in ('reg query "HKLM\Software\TeamViewer" /v "ClientID"') do (
            set /a decimal=%%a + 0
            echo TEAMVIEWER ID: >> %computername%.nfo
            echo %decimal% >> %computername%.nfo
        )
    )

Расширение происходит до выполнения какой-либо команды внутри блока кода. По сути, все, что находится в скобках.

Поскольку errorlevel переменная уже раскрыта перед вторым reg query команда выполняется, результат второй reg query не влияет на выражение if команда, заключенная в круглые скобки.

К счастью, errorlevel переменная имеет особенность. Может использоваться if команду, не расширяя ее.

:: This is true when %errorlevel% >= 1
if errorlevel 1 (

:: This is true when %errorlevel% <= 0
if not errorlevel 1 (