2015-06-24 2 views
4

Я знаю способ сделать это, что немного напоминает обман, но приведенный ниже код создает временный файл, а затем удаляет его. Я не хочу, чтобы это произошло. Так есть ли правильный или лучший способ сделать это?Batch - вывод команды команды в переменную (несколько строк)

command 2>> "temp" 
set /p OUTPUT=<"temp" 
del "temp" 
echo %OUTPUT% 

Я знаю, что есть решение, которое использует для цикла, но это не работает для команд, которые возвращают более одной строки результата. Я хочу сохранить их все в моей переменной. (Я попробовал это code кстати)

+0

Выход в файл temp и последующий 'set/p' будет хранить только первую строку того, что находится во временном файле переменной. Это то, что вы хотите? Потому что, если это так, цикл 'for' можно легко настроить с помощью инструкции' if defined', чтобы это разрешить. – SomethingDark

+0

Возможно стоит упомянуть упоминание: желаемый вывод команды находится на STDERR. – Stephan

+0

Я хочу, чтобы все хранилось, а не сохраняло первую строку, если это возможно. – ozcanovunc

ответ

3

Вы можете поместить его в одну переменные с включением перевода строки.

setlocal EnableDelayedExpansion 
set LF=^ 


REM The two empty lines are required here 
set "output=" 
for /F "delims=" %%f in ('dir /b') do (
    if defined output set "output=!output!!LF!" 
    set "output=!output!%%f" 
) 
echo !output! 

Но может быть немного сложнее обрабатывать данные позже из-за встроенных строк.
И все еще существует предел 8190 символов на переменную.

Часто проще использовать массив.

setlocal EnableDelayedExpansion 
set "output_cnt=0" 
for /F "delims=" %%f in ('dir /b') do (
    set /a output_cnt+=1 
    set "output[!output_cnt!]=%%f" 
) 
for /L %%n in (1 1 !output_cnt!) DO echo !output[%%n]! 
+0

Оба они работают, но я предпочитаю и вторую. Спасибо! – ozcanovunc

0

выглядит немного уродливый:

for /f "delims=" %%i in ('dir notexistent.xxx 2^>^&1 1^>nul ') do echo %%i 

в глубинном объяснении here

+0

Что печатает все нормально, но я хочу их хранить. Когда я пытаюсь установить '%% i' в переменную типа' do set var = %% i', она сохраняет только последнюю строку. – ozcanovunc

+0

Я изменил тело вашего цикла, и теперь это работает для команды, которую я использую, но, к примеру, она не работает для команды «dir». 'do ( ozcanovunc

+1

см. [задержанная ловушка расширения] (http://stackoverflow.com/a/30284028/2152082). Кроме того, значение varaible не может иметь переводы строк. 'set output =! output! %% i' будет конкатенировать все строки в однострочное значение (вам здесь не нужно'/p', и поэтому также не ' Stephan

Смежные вопросы