Jak mogę uruchomić aplikację wiersza polecenia w wierszu polecenia systemu Windows, aby dane wyjściowe były jednocześnie wyświetlane i przekierowywane do pliku?
Jeśli na przykład miałbym uruchomić polecenie dir > test.txt
, przekierowałoby to wyjście do pliku wywoływanego test.txt
bez wyświetlania wyników.
Jak napisać polecenie, aby wyświetlić dane wyjściowe i przekierować dane wyjściowe do pliku w wierszu polecenia systemu Windows, podobnie jak tee
polecenie w systemie Unix?
batch-file
cmd
stdout
tee
Edward Thomson
źródło
źródło
Odpowiedzi:
Aby rozwinąć odpowiedź davor , możesz użyć programu PowerShell w następujący sposób:
Jeśli próbujesz przekierować wyjście exe w bieżącym katalogu, musisz użyć
.\
nazwy pliku, np .:źródło
dir
w PowerShell jest alias, doGet-ChildItem
którego nie przypomina wewnętrznegodir
polecenia cmd . Potrzebujesz,powershell "cmd /c dir | tee test.txt"
jeśli chcesz wersję wewnętrzną cmd2>&1
, na przykładnode 2>&1 | tee debug_log.txt
Udało mi się znaleźć rozwiązanie / obejście przekierowywania danych wyjściowych do pliku, a następnie do konsoli:
gdzie dir jest poleceniem, do którego wyjścia należy przekierować, a.txt plik, w którym należy zapisać dane wyjściowe.
źródło
&
zamiast|
wyjścia jest potrzebne wyjście niektórych poleceń, takich jakping
lub7z.exe
dir
. Przykład:chkdsk /f c: > c:\Temp.txt | c:\Temp.txt
. Plik raportu systemowego jest blokowany przez inny proces.handle output to stderr
- dodaj2>&1
przekierowanie więc jest tak:dir 2>&1 > a.txt & type a.txt
a ty powinny mieć stderr miesza się z stdout.Jest port Win32
tee
polecenia Unix , który robi dokładnie to. Zobacz http://unxutils.sourceforge.net/ lub http://getgnuwin32.sourceforge.net/źródło
tee
miałeś problem ze znalezieniem pakietu GnuWin32, znajdziesz go w gnuwin32.sourceforge.net/packages/coreutils.htm .Sprawdź to: wintee
Nie potrzebujesz cygwina.
Spotkałem się i zgłosiłem kilka problemów.
Możesz także sprawdzić unxutils, ponieważ zawiera tee (i nie potrzebujesz cygwina), ale uważaj, że wyjściowe EOL są tutaj podobne do UNIX-a.
Wreszcie, jeśli masz PowerShell, możesz wypróbować Tee-Object. Wpisz
get-help tee-object
konsolę PowerShell, aby uzyskać więcej informacji.źródło
tee
generuje dane w czasie rzeczywistym.wtee
ma tę samą funkcjonalność. Jeśli nie masz nic przeciwko błędom, będzie dobrze.@ tori3852
znalazłem to
nie działało (tylko kilka pierwszych wierszy listowania katalogów - podejrzewam, że rozwidla się jakiś proces, a druga część, polecenie „typ” zakończyło się przed zakończeniem listingu?), więc zamiast tego użyłem:
który zrobił - sekwencyjne polecenia, jedno wykonuje się przed drugim uruchomieniem.
źródło
&
zamiast,&&
jeśli chcesz się upewnić, żetype
polecenie zostało wykonane, nawet jeślidir
polecenie się nie powiedzie. Jest to przydatne, gdy w twoim poleceniu wystąpił jakiś błąd i nadal chcesz zobaczyć plik dziennika na konsoli. Zobacz artykuł Microsoft na ten temat . Problem%errorlevel%
polega jednak na ustawieniu poziomu błędu natype
(który wynosiłby 0).Niestety nie ma czegoś takiego.
Aplikacje konsoli Windows mają tylko jeden uchwyt wyjściowy. (Cóż, są dwa
STDOUT
,STDERR
ale to nie ma znaczenia).>
Przekierowuje wyjście normalnie zapisywane do uchwytu konsoli do uchwytu pliku.Jeśli chcesz mieć pewnego rodzaju multipleksowanie, musisz użyć zewnętrznej aplikacji, na którą możesz przekierować wyjście. Ta aplikacja może następnie ponownie zapisać plik i konsolę.
źródło
tee
na * nix to także osobna aplikacja, a nie jakieś przekierowanie na powłokęProsta aplikacja na konsolę C # załatwi sprawę:
Aby tego użyć, po prostu potokuj polecenie źródłowe do programu i podaj ścieżkę do plików, które chcesz zduplikować. Na przykład:
Wyświetli wyniki dir, a także zapisze wyniki zarówno w plikach1.txt, jak i plikach2.txt.
Należy pamiętać, że powyższy sposób obsługi błędów nie ma wiele (nic!), A obsługa wielu plików może nie być wymagana.
źródło
To działa, choć jest trochę brzydkie:
Jest nieco bardziej elastyczny niż niektóre inne rozwiązania, ponieważ działa instrukcja po instrukcji, dzięki czemu można go również używać do dołączania. Używam tego dość często w plikach wsadowych do rejestrowania i wyświetlania komunikatów:
Tak, możesz po prostu powtórzyć instrukcję ECHO (raz na ekranie i po raz drugi przekierowanie do pliku dziennika), ale wygląda to tak samo źle i jest to trochę problem z konserwacją. Przynajmniej w ten sposób nie musisz wprowadzać zmian w wiadomościach w dwóch miejscach.
Zauważ, że _ to tylko krótka nazwa pliku, więc musisz ją usunąć na końcu pliku wsadowego (jeśli używasz pliku wsadowego).
źródło
type
Naprawiono to, umieszczając polecenia w osobnych wierszach (w podprogramie).mtee to małe narzędzie, które działa bardzo dobrze w tym celu. Jest bezpłatny, źródło jest otwarte i po prostu działa.
Można go znaleźć na stronie http://www.commandline.co.uk .
Używana w pliku wsadowym do wyświetlania danych wyjściowych ORAZ utworzenia pliku dziennika jednocześnie, składnia wygląda następująco:
Gdzie / + oznacza dołączenie wyniku.
Zakłada się, że skopiowałeś mtee do folderu, który znajduje się w PATH, oczywiście.
źródło
Chciałbym trochę rozwinąć doskonałą odpowiedź Saxona Druce'a .
Jak już wspomniano, możesz przekierować wyjście pliku wykonywalnego w bieżącym katalogu w następujący sposób:
Jednak tylko loguje się
stdout
dotest.txt
. Nie rejestruje się równieżstderr
.Oczywistym rozwiązaniem byłoby użycie czegoś takiego:
Jednak to nie zadziała dla wszystkich
something.exe
s. Niektórzysomething.exe
s zinterpretują to2>&1
jako argument i zawiodą. Prawidłowe rozwiązanie to zamiast tego mieć apostrofy tylko wokółsomething.exe
przełączników i argumentów, tak jak poniżej:źródło
'tee' is not recognized as an internal or external command
z oczywistych powodów. Z2>&1
wewnątrz cmd linii dowolne wyjście na stderr powoduje błędy z PowerShell.Zgadzam się z Brianem Rasmussenem, że port unxutils jest najłatwiejszym sposobem na zrobienie tego. W sekcji Pliki wsadowe swoich stron skryptów Rob van der Woude zawiera wiele informacji na temat korzystania z poleceń MS-DOS i CMD. Pomyślałem, że może on mieć natywne rozwiązanie twojego problemu i po tym, jak się tam przekopałem , znalazłem TEE.BAT , który wydaje się być właśnie implementacją tee w MS-DOS. Jest to dość skomplikowany plik wsadowy i nadal chciałbym używać portu unxutils.
źródło
Jeśli masz cygwin na ścieżce środowiska Windows, możesz użyć:
źródło
dir 1>a.txt 2>&1 | type a.txt
Pomoże to przekierować STDOUT i STDERR
źródło
Wiem, że to bardzo stary temat, ale we wcześniejszych odpowiedziach nie ma pełnej implementacji trójnika w czasie rzeczywistym napisanego Batch. Moje rozwiązanie poniżej to hybrydowy skrypt Batch-JScript, który używa sekcji JScript tylko w celu uzyskania danych wyjściowych z polecenia potokowego, ale przetwarzanie danych odbywa się w sekcji Batch. Takie podejście ma tę zaletę, że każdy programista Batch może modyfikować ten program, aby dopasować go do określonych potrzeb. Ten program również poprawnie przetwarza dane wyjściowe polecenia CLS wygenerowane przez inne pliki wsadowe, tzn. Czyści ekran po wykryciu danych wyjściowych polecenia CLS.
źródło
file.exe 2>output.txt
file.exe 2>&1|tee.bat
Szukałem również tego samego rozwiązania, po krótkiej próbie udało mi się to osiągnąć w wierszu polecenia. Oto moje rozwiązanie:
Przechwytuje nawet dowolne polecenie PAUZA.
źródło
Oto próbka tego, czego użyłem na podstawie jednej z pozostałych odpowiedzi
źródło
Coś takiego powinno zrobić to, czego potrzebujesz?
źródło
wyślij dane wyjściowe do konsoli, dołącz do dziennika konsoli, usuń dane wyjściowe z bieżącego polecenia
źródło
Jest to odmiana poprzedniej odpowiedzi MTS, jednak dodaje ona niektórych funkcji, które mogą być przydatne dla innych. Oto metoda, której użyłem:
set _Temp_Msg_Cmd=
^
znaku marchewki, więc polecenia nie są początkowo oceniane%~n0_temp.txt
który używa składni rozszerzenia parametru wiersza polecenia,%~n0
aby uzyskać nazwę pliku wsadowego.%~n0_log.txt
Oto sekwencja poleceń:
^> %~n0_temp.txt 2^>^&1
^& type %~n0_temp.txt ^>^> %~n0_log.txt
^& type %~n0_temp.txt
^& del /Q /F %~n0_temp.txt
Oto przykład:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
W ten sposób polecenie można po prostu dołączyć po późniejszych poleceniach do pliku wsadowego, który wygląda na znacznie czystszy:
echo test message %_Temp_Msg_Cmd%
Można to również dodać na końcu innych poleceń. O ile mogę stwierdzić, będzie działać, gdy wiadomości mają wiele linii. Na przykład następujące polecenie wyświetla dwa wiersze, jeśli pojawia się komunikat o błędzie:
net use M: /D /Y %_Temp_Msg_Cmd%
źródło
Spowoduje to utworzenie pliku dziennika z bieżącą datą i możesz konsolować wiersze konsoli podczas procesu
źródło
Korzystam z podprogramu wsadowego z instrukcją „for”, aby uzyskać dane wyjściowe polecenia po jednym wierszu, i oba zapisują ten wiersz do pliku i wysyłają go do konsoli.
źródło
Jeśli korzystasz z interfejsu CLI, skorzystaj z pętli FOR, aby „zrobić” cokolwiek chcesz:
Świetny zasób na Windows CMD dla pętli: https://ss64.com/nt/for_cmd.html Kluczem tutaj jest ustawienie ograniczników (delimów), które zerwałyby każdą linię wyjścia, do zera. W ten sposób nie zepsuje się domyślnej białej spacji. % A to dowolna litera, ale jest używana w sekcji „do”, aby ... cóż ... zrobić coś ze znakami, które zostały przeanalizowane w każdym wierszu. W takim przypadku możemy użyć znaków ampersands (&&) do wykonania drugiego polecenia echa w celu utworzenia lub dołączenia (>>) do wybranego przez nas pliku. Bezpieczniej jest zachować tę kolejność poleceń DO na wypadek, gdyby wystąpił problem z zapisaniem pliku, przynajmniej dostaniemy echo do konsoli. Znak at (@) przed pierwszym echem powstrzymuje konsolę przed wyświetlaniem samego polecenia echo, a zamiast tego wyświetla wynik polecenia, które ma wyświetlać znaki w% a. W przeciwnym razie zobaczysz:
AKTUALIZACJA: / F pomija puste linie i jedyną poprawką jest wstępne filtrowanie wyniku, dodając znak do każdej linii (być może z numerami linii za pomocą polecenia find). Rozwiązanie tego w CLI nie jest szybkie ani ładne. Nie dodałem także STDERR, więc tutaj również są błędy:
Przekierowywanie komunikatów o błędach
Kreski (^) służą do ucieczki przed symbolami po nich, ponieważ polecenie jest ciągiem, który jest interpretowany, w przeciwieństwie do tego, wprowadzając go bezpośrednio w wierszu polecenia.
źródło
Podobnie jak unix.
dir | tee a.txt
Działa w systemie Windows XP, wymaga
mksnt
zainstalowania.Wyświetla się w monicie, a także dołącza się do pliku.
źródło
Poniższe informacje pomagają, jeśli chcesz naprawdę zobaczyć coś na ekranie - nawet jeśli plik wsadowy został przekierowany do pliku. Urządzenie CON może być również używane, jeśli zostanie przekierowane do pliku
Przykład:
Zobacz także dobry opis przekierowania: http://www.p-dd.com/chapter7-page14.html
źródło
Przydatne mogą być te polecenia w skryptowaniu bitów ( http://www.biterscripting.com ).
źródło
Działa to w czasie rzeczywistym, ale jest też trochę brzydkie, a wydajność jest niska. Niezbyt dobrze przetestowany:
źródło
%MYCOMMAND%
zakończenie i w wielu przypadkach kończy się niepowodzeniem. Pomija ono puste linie, linie zaczynające się;
nie powiedzie się z treścią jak<space>/<TAB>
,ON
,OFF
lub/?
. Ale reszta może czasem działać :-)Alternatywą jest wprowadzenie standardowego do standardowego w swoim programie:
w java:
Następnie w pliku wsadowym dos:
java program > log.txt
Stdout przejdzie do pliku dziennika, a stderr (te same dane) pojawi się na konsoli.
źródło
Instaluję perla na większości moich maszyn, więc odpowiedź za pomocą perla: tee.pl
reż | perl tee.pl lub reż | perl tee.pl reż. bat
surowy i nieprzetestowany.
źródło
Inną odmianą jest podzielenie potoku, a następnie przekierowanie wyjścia według własnego uznania.
Zapisz powyższe w pliku .bat. Dzieli również tekst na strumieniu plików 1 na strumień plików 3, który można przekierować w razie potrzeby. W poniższych przykładach nazwałem powyższy skrypt splitPipe.bat ...
źródło
c:\cygwin64\bin\script.exe
i wpiszcmd
i wpiszexit
i wprowadź (wychodzi z Cygwin's cmd.exe)exit
i wprowadź (wychodzi z Cygwin's script.exe)źródło