it-swarm.com.ru

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

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

set var = reg query hklm\ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ\Macromedia\FlashPlayer\CurrentVersion>

или же

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

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

38
user2283234

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

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

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

80
Prof Pickle

Этот пост есть метод для достижения этой цели

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

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

Вы не можете назначить вывод процесса непосредственно в 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.

2
ElektroStudios

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

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

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

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