Введіть весь вихід пакетного файлу


12

Я використовую сценарій командного рядка для налаштування кількох налаштувань на комп’ютері. Однак я хотів би, щоб весь результат також був увійшов у файл .txt або .log.

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

Хтось міг би сказати мені, як це зробити?

Спасибі заздалегідь! Демпсі


Ви навіть не вказали операційну систему!
Майкл Хемптон

Відповіді:


11

Якщо питання вимагає "виконувати" сценарій, а весь пакетний файл виводиться у файл журналу в Windows 8.1, ось ось проста відповідь:

Включіть це на початку вашого пакетного файлу ...

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

:LOG
[ your script goes here ]

Відмінно, дякую! (Звичайно,% LOGFILE% тут справді не потрібен.: P)
Ендрю

1
Мій сценарій ставить запитання - я не бачу його, якщо це використовується. Як записати все та побачити це на екрані під час виконання?
Саймон

Так, як би ви це зробили, щоб ви могли бачити це, поки він знаходиться на екрані?
karl-police

3

У своєму запитанні ви згадуєте:

"... він поставить вихід у файл, але насправді не виконає його. У моєму випадку мені потрібно його виконати, а потім увійти у файл для подальшого посилання."

Оскільки ви кажете, що програма запущена, і її результат вводиться у файл, я подумав, що ви могли мати на увазі "відображається" , а не "виконується" .

Якщо це не те, що ви мали на увазі, то, можливо, це допомогло б, якби це було пояснено краще, можливо, з деяким результатом вибірки.

У будь-якому випадку, я публікую цю відповідь, якщо є інші, хто вважає це питання / відповіді корисним.

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

(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

Журнал не буде виконаний.


1
Зауважте, що це передбачає Unix / Linux, але я гадаю, що OP говорить про Windows. Це також не запуск сценарію, але реєстрація результатів команд, які ви вводите, і не містить критичної інформації про те, як зупинити безумство ...
Sven

Я справді кажу про Windows. Дякую хоч :)
Dempsey FoxDie Van Assche
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.