Назначить вывод команды переменной в пакетном файле

Я пытаюсь присвоить вывод команды переменной - например, я пытаюсь установить текущую версию флэш-памяти для переменной. Я знаю, что это неправильно, но вот что я попробовал:

set var=reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion>

или же

reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion >> set var

Да, как ты видишь, я немного растерялся. Любая помощь приветствуется!

Ответ 1

Метод уже разработан, однако, таким образом, вам не нужен временный файл.

for /f "delims=" %%i in ('command') do set output=%%i

Однако я уверен, что у этого есть свои исключения и ограничения.

Ответ 2

Этот пост имеет способ достижения этого

из (zvrba) Вы можете сделать это, сначала перенаправляя вывод в файл. Например:

echo zz > bla.txt
set /p VV=<bla.txt
echo %VV%

Ответ 3

Вы не можете назначить вывод процесса непосредственно в var, вам нужно проанализировать вывод с помощью цикла For/F:

@Echo OFF

FOR /F "Tokens=2,*" %%A IN (
    'Reg Query "HKEY_CURRENT_USER\Software\Macromedia\FlashPlayer" /v "CurrentVersion"'
) DO (
    REM Set "Version=%%B"
    Echo Version: %%B
)

Pause&Exit

http://ss64.com/nt/for_f.html

PS: При необходимости измените ключ reg.

Ответ 4

Хорошо, здесь более сложный образец для использования For/F

:: Main
@prompt -$G
    call :REGQUERY  "Software\Classes\CLSID\{3E6AE265-3382-A429-56D1-BB2B4D1D}"

@goto :EOF

:REGQUERY
:: Checks HKEY_LOCAL_MACHINE\ and HKEY_CURRENT_USER\ 
:: for the key and lists its content

    @call :EXEC "REG QUERY  HKCU\%~1"
    @call :EXEC "REG QUERY "HKLM\%~1""

@goto :EOF    

:EXEC
    @set output=

    @for /F "delims=" %%i in ('%~1 2^>nul') do @(
        set output=%%i
    )

    @if not "%output%"=="" (
        echo %1 -^> %output%
    )

@goto :EOF

Я упаковал его в подфункцию : EXEC, поэтому все ее неприятные детали реализации не помещают основной script. Так что он получил какой-то пакетный учебник. Примечания: "Код:

  • вывод команды, выполняемой с помощью команды : команда EXEC, хранится в % output%. Пакетный cmd не интересуется областями, поэтому% output% будет также доступен в главном script.
  • @ начало - это просто украшение и подавление эха в командной строке. Вы можете удалить их все и просто поместить некоторые @echo off в первой строке, это действительно не нравится. Однако, как я считаю, отладка гораздо приятнее. Украшение номер два - подсказка - $G. Это там, чтобы сделать командную строку, выглядят так:
  • Я использую :: вместо rem
  • тильда (~) в % ~ 1 заключается в удалении кавычек из первого аргумента
  • 2 ^ > nul существует, чтобы подавить/удалить вывод ошибки stderr. Обычно вы делаете это через 2 > nul. Ну, ^ побег в партии char позволяет избежать раннего разрешения перенаправитель ( > ). Там некоторые simulare используют немного позже в script: echo %1 -^>..., поэтому там ^ позволяет выводить а ' > ' через эхо, что еще не было бы возможно.
  • даже если сравнение в @if not "%output%"=="" выглядит в большинстве распространенных языков программирования - возможно, оно отличается от ожидаемого (если вы не используете MS-пакет). Удалите "@" в начале. Изучите выход. Измените его на not %output%=="" -rerun и подумайте, почему это не работает.;)

Ответ 5

Это работа для меня

@FOR /f "delims=" %i in ('reg query hklm\SOFTWARE\Macromedia\FlashPlayer\CurrentVersion') DO set var=%i
echo %var%