Mam skrypt wsadowy, który wykonuje zadanie i wysyła dane wyjściowe do pliku tekstowego. Czy istnieje sposób, aby dane wyjściowe były wyświetlane również w oknie konsoli?
Na przykład:
c:\Windows>dir > windows-dir.txt
Czy jest sposób, aby dane wyjściowe dir
wyświetlania w oknie konsoli, a także umieścić je w pliku tekstowym?
windows
batch-file
cmd
JamesEggers
źródło
źródło
Odpowiedzi:
Nie, nie możesz z czystym przekierowaniem.
Ale z niektórymi sztuczkami (jak tee.bat ) możesz.
Staram się trochę wyjaśnić przekierowanie.
Przekierowujesz jeden z dziesięciu strumieni za pomocą > plik lub <plik.
Nie ma znaczenia, czy przekierowanie następuje przed lub po poleceniu, więc te dwie linie są prawie takie same.
Przekierowanie w tym przykładzie jest tylko skrótem do 1> , co oznacza, że zostanie przekierowany strumień 1 (STDOUT).
Możesz więc przekierować dowolny strumień, poprzedzając liczbę, taką jak 2> err.txt, a także możesz przekierować wiele strumieni w jednej linii.
W tym przykładzie „standardowe wyjście” zostanie umieszczone w plikach.txt, wszystkie błędy w err.txt, a strumień 3 - do nic.txt (DIR nie używa strumienia 3).
Strumień0 to STDIN
Strumień1 to STDOUT
Strumień2 to STDERR
Strumienie 3-9 nie są używane
Ale co się stanie, jeśli spróbujesz wielokrotnie przekierować ten sam strumień?
„Może być tylko jeden” i zawsze jest ostatni!
Czyli jest równe dir> two.txt
Ok, jest jeszcze jedna możliwość, przekierowanie strumienia do innego strumienia.
2> & 1 przekierowuje stream2 do stream1, a 1> files.txt przekierowuje wszystko do files.txt .
Kolejność jest tutaj ważna!
są różne. Pierwsza z nich przekierowuje wszystkie (STDOUT i STDERR) do NUL,
ale druga linia przekierowuje STDOUT do NUL i STDERR do „pustego” STDOUT.
Podsumowując, jest oczywiste, dlaczego przykłady Otávio Décio i andynormancx nie działają.
Obaj próbują przekierować stream1 dwa razy, ale „może być tylko jeden” i zawsze jest to ostatni.
Więc masz
W pierwszym przykładzie przekierowanie stream1 do stream1 jest niedozwolone (i niezbyt przydatne).
Mam nadzieję, że to pomoże.
źródło
3<&2
(uwaga na LT zamiast GT), a potem3>errors.txt
. Ale to się źle skończyło - wszystkie następne wyjście stderr zostało przechwyconeerrors.txt
(to znaczy - także z innych poleceń!).for /f "delims=" %%v in ('dir') do echo %%v>>file.txt
.Po prostu użyj wersji UNIX tee polecenia systemu Windows (znalezionej na stronie http://unxutils.sourceforge.net ) w następujący sposób:
Jeśli potrzebujesz również wyjścia STDERR, użyj następującego. Łączy wyjście StdErr do standardowe wyjście (strumień podstawowy).
2>&1
źródło
1>tee a.txt
przekieruje standardowe wyjście do pliku o nazwietee
zamiast wywoływaniatee
polecenia. Czy ktoś może potwierdzić, że ta odpowiedź działa dla niego?Jeśli nie potrzebujesz danych wyjściowych w czasie rzeczywistym (np. Gdy program je zapisuje), możesz dodać
po tej linii.
źródło
dir > windows-dir.txt & type windows-dir.txt
. Odnosi się to także do bloków:( echo %date% <NL> echo %username% <NL> echo %time% <NL> pause>CON )>test.txt & type test.txt
. Jednakże, jeśli wyjście jest wymagane w czasie rzeczywistym, można użyć np Windows port tee narzędzie, które ...Rozwiązaniem, które zadziałało, było: dir> a.txt | wpisz a.txt .
źródło
Tak, istnieje sposób na pokazanie wyjścia pojedynczego polecenia na konsoli (ekranie) oraz w pliku. Na swoim przykładzie użyj ...
Szczegółowe wyjaśnienie:
Plik
FOR
Polecenie przetwarza dane wyjściowe polecenia lub tekst do zmiennej, która może się odwoływać wielokrotnie.Polecenie, takie jak
DIR /B
, należy ująć w pojedyncze cudzysłowy, jak pokazano w przykładzie poniżej. ZastąpDIR /B
tekst żądanym poleceniem.Aby wyświetlić tekst, umieść go w podwójnych cudzysłowach, jak pokazano w przykładzie poniżej.
... i z zawijaniem linii ...
Jeśli zdarzają się sytuacje, w których chcesz, aby dane wyjściowe były tylko na konsoli (ekranie), a innym razem wysyłane tylko do pliku, a innym razem wysyłane do obu, określ klauzulę „DO” pętli FOR za pomocą zmiennej, jak pokazano poniżej za pomocą
%TOECHOWHERE%
.źródło
delims=
.źródło
Jeśli chcesz dołączyć zamiast zastępować plik wyjściowy, możesz użyć
lub
źródło
Moja opcja była taka:
Utwórz podprogram, który przyjmuje wiadomość i automatyzuje proces wysyłania jej zarówno do konsoli, jak i do pliku dziennika.
Jeśli dodasz zmienną do wiadomości, pamiętaj, aby usunąć zawarte w niej cudzysłowy przed wysłaniem jej do podprogramu, w przeciwnym razie może to wkręcić twoją partię. Oczywiście działa to tylko w przypadku echa.
źródło
setlocal enabledelayedexpansion
zamiast tylkosetlocal
2) Używam opóźnionego rozwinięcia dla zmiennej logfile, więc>> !logfile!
zamiast>> %logfile%
w podprogramie. W ten sposób działa, gdy jest wywoływana z bloku kodu (jak w instrukcji if). 3) Usunąłem wiersz „ustaw wiadomość”, ponieważ nie ma potrzeby stosowania dodatkowej zmiennej. Mamy już to w,$~1
więc mamecho $~1
dla obu poleceń echa.Zrobiłem prostą konsolę C #, która może obsługiwać dane wyjściowe w czasie rzeczywistym zarówno do ekranu cmd, jak i dziennika
Użycie pliku wsadowego jest takie samo, jak w przypadku korzystania z systemu Unix
tee
A oto repozytorium zawierające Tee.exe na wypadek, gdybyś nie miał narzędzia do kompilacji https://github.com/iamshiao/Tee
źródło
Podoba mi się odpowiedź atn, ale nie było to dla mnie tak trywialne, jak pobranie wintee , które jest również open source i zapewnia tylko funkcjonalność koszulki (przydatne, jeśli chcesz tylko tee, a nie cały zestaw narzędzi unixowych). Dowiedziałem się o tym z odpowiedzi davora na Wyświetlanie wyjścia wiersza poleceń systemu Windows i przekierowanie go do pliku , w którym znajduje się również odniesienie do narzędzi unixowych.
źródło
Rozwiązanie dostarczone przez „Tomasa R” działa idealnie na pytanie OP i jest dostępne natywnie.
Spróbuj: chkdsk c:> output.txt | wpisz output.txt
Wynik tego polecenia zawiera procent ukończenia, który jest seryjnie wysyłany do pliku, dlatego będzie wyglądał nieco niechlujnie (tj. Tekst będzie dołączany w miarę postępu). Nie dotyczy to bitów wysyłanych do STDOUT (ekran). Tak by było, gdybyś wykonał to samo polecenie bez przekierowania.
źródło
Myślę, że chcesz czegoś podobnego do tego:
Lub jeśli chcesz nową linię:
Te polecenia świetnie nadają się do dzienników.
Uwaga: czasami powoduje to usterkę i zastąpienie całego pliku tekstowego na moim komputerze.
Kolejna uwaga: jeśli plik nie istnieje, utworzy plik.
źródło
>
jest przeznaczony do nadpisywania pliku. Użyj,>>
aby dołączyć )