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

<p>я пытаюсь присвоить вывод команды переменной - например, я пытаюсь установить текущую версию флэш-памяти для переменной. я знаю, что это неправильно, но вот что я попробовал:</p><blockquote> <p>set var = reg query hklm\программное обеспечение\macromedia\flashplayer\currentversion></p> </blockquote><p>или же</p><blockquote> <p>reg запрос hklm\software\macromedia\flashplayer\currentversion >> set var</p> </blockquote><p>да, как ты видишь, я немного растерялся. любая помощь приветствуется!</p>

<p>метод уже разработан, однако для этого вам не нужен временный файл.</p><pre><code>for /f "delims=" %%i in ('command') do set output=%%i </code></pre><p>однако я уверен, что у этого есть свои исключения и ограничения.</p>

<p> <a href="https://stackoverflow.com/questions/2768608/batch-equivalent-of-bash-backticks">этот пост</a> есть метод для достижения этой цели</p><blockquote> <p>от (зврба) вы можете сделать это, перенаправив вывод в файл первым. например: </p> </blockquote><pre><code>echo zz > bla.txt set /p vv=<bla.txt echo %vv% </code></pre>

<p>вы не можете назначить вывод процесса непосредственно в var, вам нужно проанализировать вывод с помощью цикла for/f:</p><pre><code>@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 </code></pre><p> <a href="http://ss64.com/nt/for\_f.html">http://ss64.com/nt/for\_f.html</a> </p><p>ps: при необходимости измените используемый ключ reg.</p>

<p>хорошо, вот еще более сложный пример для использования<strong> for/f </strong></p><pre><code>:: main @prompt -$g call :regquery "softwareclassesclsid{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 я упаковал его в подфункцию<strong>: exec </strong>так что все его неприятные детали реализации не засоряют основной сценарий . так что у него получилось какое-то пакетное руководство . примечания по поводу кода: результат выполнения команды через<strong> вызов: exec command </strong>сохраняется в<strong>% output% </strong>. batch cmd не заботится об областях, поэтому% output% также будет доступен в основном скрипте. <strong> @ </strong>начало это просто украшение и там подавлять эхо командной строки. вы можете удалить их все и просто отключить<strong> @echo off </strong>в первой строке, это действительно не нравится. однако, как это я нахожу отладку гораздо более приятным. украшение номер два -<strong> подсказка - $ g </strong>. это делается для того, чтобы команда prompt выглядела так<strong> -> </strong> </li> <li>я использую<strong> :: </strong>вместо<strong> rem </strong></li> <li>тильда (~) в<strong>% ~ 1 </strong>предназначена для удаления кавычек из первого аргумента</li> <li><strong> 2 ^> nul </strong>есть для подавления/отмены вывода ошибок <em>stderr</em>. обычно вы делаете это через<strong> 2> nul </strong>. хорошо, что<strong> ^ </strong>символ пакетного экранирования помогает избежать раннего разрешения перенаправителя (>). немного позже в сценарии используется симуляция: <code>echo %1 -^>...</code>, так что там ^ делает возможным вывод '>' через echo, что еще было бы невозможно.</li> <li>даже если сравнение в <code>@if not "%output%"==""</code> выглядит как в большинстве распространенных языков программирования - возможно, оно отличается от ожидаемого (если вы не привыкли к ms-batch). хорошо удалите «@» в начале. изучите вывод. измените его на <code>not %output%==""</code>- перезапустите и подумайте, почему это не работает. ;)</li> </ol>

<p>это работа для меня</p><pre><code>@for /f "delims=" %i in ('reg query hklm\software\macromedia\flashplayer\currentversion') do set var=%i echo %var% </code></pre>