9

Я использую сценарий командной строки для настройки нескольких параметров на компьютере. Тем не менее, я хотел бы, чтобы весь вывод был также зарегистрирован в файле .txt или .log.

Когда я использую свои базовые знания о системе ведения журналов, она помещает вывод в файл, но фактически не выполняет его. В моем случае мне нужно было выполнить его, а затем войти в файл для дальнейшего использования.

Кто-нибудь сможет сказать мне, как это сделать?

Заранее спасибо! Dempsey

3 ответа3

8

Если вопрос требует, чтобы скрипт был "выполнен" и весь пакетный файл был выведен в файл журнала в Windows 8.1, то вот простой ответ:

Включите это в начало вашего пакетного файла ...

@echo off
set LOGFILE=batch.log
call :LOG > %LOGFILE%
exit /B

:LOG
[ your script goes here ]
3

В своем вопросе вы упоминаете:

msgstr "... он поместит вывод в файл, но не выполнит его. В моем случае мне нужно было выполнить его, а затем войти в файл для дальнейшего использования. "

Поскольку вы говорите, что программа работает, а ее вывод помещается в файл, я подумал, что вы могли иметь в виду "отображаемый", а не "выполненный".

Если это не то, что вы имели в виду, то, возможно, это помогло бы, если бы это было объяснено лучше, возможно, с некоторым примером вывода.

В любом случае, я публикую этот ответ, если есть другие, которые считают этот вопрос / ответ полезным.

Таким образом, в основном это звучит так, как будто вы хотите, чтобы выходные данные сценария были записаны в файл, а также чтобы вы могли видеть выходные данные сценария на экране во время его выполнения.

(tl; dr версия: используйте wintee, вот так:

script 2>&1 | wtee logfile.txt)


В этом посте я буду использовать небольшой тестовый пакетный файл, но ваш скрипт может быть настолько большим и сложным или настолько простым, насколько вам нужно:

C:\>type a.cmd
@echo off

echo Command: "dir /b a*"
dir /b a*
echo.

echo Command: "dir /b non-existant-file"
dir /b non-existant-file
echo.


Вот что происходит, когда я запускаю этот пакетный скрипт:

C:\>a.cmd
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

Обратите внимание, что в тестовом сценарии первое выполнение команды "dir" прошло успешно, а второе - не удалось. Я делаю это только для того, чтобы показать, что произойдет с "сообщениями об ошибках" при запуске скрипта.

Если я запущу скрипт и использую перенаправление (">") для захвата вывода, я увижу это

C:\>a.cmd > log.txt
File Not Found

C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"

C:\>

Обратите внимание, что сообщение об ошибке "Файл не найден" отображалось на экране при запуске сценария и фактически не было записано в файл. Это потому, что «>» захватывает "нормальный вывод", который был отправлен в поток STDOUT. "Сообщения об ошибках" обычно отправляются в поток STDERR.

Чтобы захватить "нормальный вывод" и "сообщения об ошибках", вам также нужно захватить поток STDERR, который обозначен "2" в «2> & 1» в команде здесь:

C:\>a.cmd > log.txt 2>&1
C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

В unix есть стандартная команда: "tee"

Используя команду "tee", вы можете захватывать выходные данные из программы, а также одновременно отображать выходные данные на экране.

Команда "tee" не является стандартной для Windows, но вы можете скачать бесплатную версию "tee" для Windows здесь: wintee. Скачанная программа называется: "wtee.exe".

Вы используете программу "wtee.exe", как показано ниже.

Это будет захватывать вывод скрипта в файл с именем "log.txt" как и раньше, а также отображать вывод на экран во время работы скрипта:

C:\>a.cmd 2>&1 | wtee log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

C:\>type log.txt
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found
0

Этот скрипт выполнит ls и запишет свой вывод в файл с именем log.txt:

exec >log.txt 2>&1
ls

Журнал не будет выполнен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .