2013-04-24 4 views
38

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

набор вар = рег запрос HKLM \ SOFTWARE \ Macromedia \ FlashPlayer \ CurrentVersion>

или

рег запрос hklm \ SOFTWARE \ Macromedia \ FlashPlayer \ CurrentVersion >> set var

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

+0

Если приведенные ниже ответы не помогли, перенаправление поиска на google. –

+0

Возможный дубликат [Пакетный эквивалент обратных ссылок Баша] (http://stackoverflow.com/questions/2768608/batch-equivalent-of-bash-backticks) –

+0

На самом деле оригинал кажется [Как получить результат команда в переменной в окнах?] (http://stackoverflow.com/q/108439/12892). –

ответ

79

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

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

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

+0

Удивительный, спасибо за помощь! – user2283234

+2

Если он решил ваш вопрос, отметьте его как принятый. –

+2

Я получаю '%% i был неожиданным в это время.' В результате, когда я выполняю команду выше. Не знаю, почему. –

9

This post есть метод для достижения этой

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

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

Вы не можете присвоить результат процесса непосредственно в вар, вам нужно разобрать выход с петлей для/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: Изменить ключ используется, если рег необходимо.

1

Хорошо здесь некоторые более сложный образец для использования Для/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 так все его неприятные детали реализации не засоряет основной сценарий. Итак, у него есть какой-то пакетный учебник. Примечания насчет кода:

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