Zaloguj cały plik wyjściowy pliku wsadowego

12

Korzystam ze skryptu wiersza polecenia, aby dostosować wiele ustawień na komputerze. Chciałbym jednak, aby całe dane wyjściowe były również logowane do pliku .txt lub .log.

Kiedy wykorzystam swoją podstawową wiedzę o systemie rejestrowania, umieści dane wyjściowe w pliku, ale nie wykona go. W moim przypadku musiałbym go wykonać, a następnie zalogować się do pliku w celu późniejszego wykorzystania.

Czy ktoś mógłby mi powiedzieć, jak to zrobić?

Z góry dziękuję! Dempsey

Dempsey FoxDie Van Assche
źródło
Nie określiłeś nawet systemu operacyjnego!
Michael Hampton

Odpowiedzi:

11

Jeśli pytanie wymaga „wykonania” skryptu, a cały plik wsadowy zostanie zapisany w pliku dziennika w systemie Windows 8.1, oto prosta odpowiedź:

Uwzględnij to na początku pliku wsadowego ...

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

:LOG
[ your script goes here ]
Ingrid
źródło
Wspaniale, dziękuję! (Oczywiście,% LOGFILE% nie jest tu naprawdę potrzebny.: P)
Andrew
1
Mój skrypt stawia pytanie - nie widzę go, jeśli zostanie użyty. Jak zalogować wszystko i zobaczyć to na ekranie podczas wykonywania?
Simon
Tak, jak byś to zrobił, abyś mógł to zobaczyć, gdy jest na ekranie?
karl-police
3

W swoim pytaniu wspominasz:

„... umieści dane wyjściowe w pliku, ale go nie wykona. W moim przypadku musiałbym go wykonać, a następnie zalogować się do pliku w celu późniejszego wykorzystania.”

Ponieważ mówisz, że program działa, a jego dane wyjściowe są umieszczane w pliku, pomyślałem, że mógłbyś oznaczać „wyświetlany” , zamiast „wykonywany” .

Jeśli nie o to ci chodziło, to prawdopodobnie pomogłoby, gdyby to zostało wyjaśnione lepiej, być może z pewnymi przykładowymi danymi wyjściowymi.

W każdym razie zamieszczam tę odpowiedź na wypadek, gdyby inni uważali to pytanie / odpowiedź za pomocną.

Zasadniczo brzmi to tak, jakbyś chciał, aby wynik skryptu był przechwytywany do pliku, a także aby był w stanie zobaczyć wynik skryptu na ekranie podczas działania skryptu.

(wersja tl; dr: użyj wintee , jak poniżej:

script 2>&1 | wtee logfile.txt)


W tym poście użyję małego testowego pliku wsadowego, ale twój skrypt może być tak duży i skomplikowany lub tak prosty, jak potrzebujesz:

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.


Oto co się stanie, gdy uruchomię ten skrypt wsadowy:

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

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

Zauważ, że w skrypcie testowym pierwsze wykonanie polecenia „dir” zakończyło się powodzeniem, a drugie nie powiedzie się. Robię to tylko, aby pokazać, co się stanie z „komunikatami o błędach” po uruchomieniu skryptu.

Jeśli uruchomię skrypt i użyję przekierowania ( „>” ), aby przechwycić dane wyjściowe, zobaczę to

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:\>

Zauważ, że komunikat o błędzie „Nie znaleziono pliku” był wyświetlany na ekranie podczas uruchamiania skryptu i nie został faktycznie przechwycony do pliku. Jest tak, ponieważ „>” przechwytuje „normalne wyjście”, które zostało wysłane do strumienia STDOUT. „Komunikaty o błędach” są zwykle wysyłane do strumienia STDERR.

Aby przechwycić „normalne wyjście” i „komunikaty o błędach”, musisz również przechwycić strumień STDERR, który jest oznaczony przez „2” w „2> i 1” w poleceniu tutaj:

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

W unixie jest standardowe polecenie: "tee"

Za pomocą polecenia „tee” można przechwytywać dane wyjściowe z programu, a także wyświetlać dane wyjściowe na ekranie w tym samym czasie.

Polecenie „tee” nie jest standardowe w systemie Windows, ale możesz pobrać bezpłatną wersję „tee” dla systemu Windows tutaj: wintee . Pobrany program o nazwie: "wtee.exe".

Korzystasz z programu „wtee.exe”, jak pokazano poniżej.

Spowoduje to przechwycenie wyniku skryptu do pliku o nazwie "log.txt"tak jak poprzednio, a także wyświetlenie wyniku na ekranie podczas działania skryptu:

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
Kevin Fegan
źródło
0

Ten skrypt wykona ls i zapisze dane wyjściowe w pliku o nazwie log.txt:

exec >log.txt 2>&1
ls

Dziennik nie zostanie wykonany.

Thorsten Staerk
źródło
1
Zauważ, że zakłada to Unix / Linux, ale zgaduję, że OP mówi o Windowsie. Nie uruchamia również skryptu, ale rejestruje dane wyjściowe wprowadzanych poleceń i pomija kluczowe informacje, jak zatrzymać szaleństwo ...
Sven
Rzeczywiście mówię o systemie Windows. Dzięki jednak :)
Dempsey FoxDie Van Assche