Поместите вывод запроса reg в переменную - PullRequest
0 голосов
/ 03 мая 2019

Я немного неопытен с CMD и надеюсь, что кто-то здесь может мне помочь.

В одном из моих старых сценариев установки мне нужно проверить, установлен ли .NET 3.5, а затем либо установить пакет 3.5, либо продолжить работу со сценарием в зависимости от результата.

Теперь у меня возникли проблемы при попытке проверить установленную версию в моем скрипте.

Я использую этот запрос reg для поиска установленной версии:

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5"

выводит одну строку, если установлен 3.5, или ничего, если это не так:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5

Теперь моя идея состояла в том, чтобы создать переменную и заполнить значение выводом, показанным выше.

К сожалению что-то вроде:

set DNFound=reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5"
if not exist %DNFound%
(
 install framework
)

не работает, потому что вывод не будет сохранен в переменной.

Я немного исследовал и видел, как люди идут в цикле в этом формате, чтобы получить отдельные значения из вывода запроса reg в переменную (пример кода):

 for /f "tokens=3" %%x in ('reg query HKLM\System\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\StandardProfile /v EnableFirewall') do set FWSTATUS=%%x

Однако я получаю синтаксическую ошибку при попытке сделать то же самое из-за части | Find "3.5" в моем запросе reg.

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

В дополнение к вашему вопросу, поскольку он может иметь отношение к будущим пользователям, вы должны иметь возможность выводить все установленные версии, используя метод, подобный следующему:

@Echo Off
SetLocal EnableDelayedExpansion
Set "rk=HKLM\SOFTWARE\Microsoft\NET Framework Setup\NDP"
Set/A "vi=ri=0"

For /F "Tokens=3*" %%A In ('Reg Query "%rk%" /F v /K') Do If "%%B"=="" (
    If Not "%%~xA"=="" (Set/A "vi+=1"
        For /F "Tokens=2*" %%C In (
            'Reg Query "%rk%\%%~nxA" /V Version 2^>Nul^|Find /V "\"'
        ) Do Set "_v!vi!=%%D"
    ) Else (Set/A "ri+=1"
        For /F "Tokens=2*" %%E In (
            'Reg Query "%rk%\%%~nxA\Full" /V Release 2^>Nul^|Find /V "\"'
        ) Do Set/A "_r!ri!=%%F"))
If %ri% Gtr 0 (Set/A "vi+=1"
    For /F "Tokens=2" %%A In ('FindStr/B "!_r%ri%!" "%~f0"'
    ) Do Set "_v%vi%=%%A")

If %vi% Gtr 0 For /F "Tokens=1* Delims==" %%A In ('Set _v') Do Echo([%%B]

Pause
GoTo :EOF

Rem Later Version Table - do not remove
378389 4.5
378675 4.5.1
378758 4.5.1
379893 4.5.2
393295 4.6
393297 4.6
394254 4.6.1
394271 4.6.1
394802 4.6.2
394806 4.6.2
460798 4.7
460805 4.7
461308 4.7.1
461310 4.7.1
461808 4.7.2
461814 4.7.2
528040 4.8
528049 4.8

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

0 голосов
/ 03 мая 2019

Я бы посоветовал вам использовать errorlevel, чтобы определить, вернулась ли строка успешно.

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5"
if errorlevel 1 install framework

Что происходит, то find возвращает уровень ошибки 1 (без совпадений) 0 совпадений найдено. Таким образом, вам не нужно устанавливать переменную.

Вышесказанное можно расширить на несколько команд:

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" | Find "3.5"
if errorlevel 1 (
    echo Framework not found
    install framework
    echo do something else
)

Что касается проблемы цикла for, как уже упоминалось @ LotPings в комментарии, вам нужно экранировать канал ^|:

for /f "delims=" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP" ^| Find "3.5" 2^>nul) do set "var=%%i"
echo %var%
...