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