Jak przechwycić dane wyjściowe skryptu, jeśli jest uruchamiany przez harmonogram zadań?

98

Jak w systemie Windows Server 2008 przechwycić dane wyjściowe skryptu uruchamianego za pomocą harmonogramu zadań systemu Windows?

Testuję dość długi skrypt wsadowy do drukowania niestandardowego i do celów debugowania chciałbym co noc widzieć wszystkie jego wyniki.

Mechaflash
źródło
2
Czasami to nie zadziała, tj. Nie jest generowany plik dziennika. Jeden ze scenariuszy, który może do tego doprowadzić, polega na tym, że zadanie w ogóle się nie uruchomiło, ponieważ system Windows błędnie myśli, że nadal działa. Możesz to prześledzić, przechodząc do historii zadań (zakładka historii we właściwościach zadania - informacja może zająć kilka sekund)
Daniel

Odpowiedzi:

87

Spróbuj tego jako polecenia w Harmonogramie zadań:

cmd /c yourscript.cmd > logall.txt
user2744787
źródło
2
ładne, nie jest wymagane opakowanie, działa świetnie, a także rejestruje dane wyjściowe z podrzędnych skryptów PowerShell, które są wywoływane z wyzwalanego przez harmonogram zadań bat / cmd Dzięki!
Jonesome Przywróć Monikę
9
Dodatkowo użyj, cmd /c "path with spaces/command.cmd > file.txt"jeśli masz spacje. 2>&1Z odpowiedzią Iwana również idzie wewnątrz cudzysłowów.
Dinei
3
muszę użyć podwójnych cudzysłowów, aby mój działał: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo
1
Wiem, że minęło już 5 lat, ale zmieniam to na akceptowaną odpowiedź na minimalistyczny sposób wykonywania zadania.
Mechaflash
Teraz podczas uruchamiania zadania pojawia się okno poleceń. Jak temu zapobiec?
Chris
58

Z stderr (gdzie trafia większość błędów):

cmd /c yourscript.cmd > logall.txt 2>&1
Ivan
źródło
56

Aby uzupełnić odpowiedź @ user2744787, oto zrzut ekranu pokazujący, jak używać cmdargumentów w zaplanowanym zadaniu:

Zaplanowane dane wyjściowe polecenia cmd zadania do pliku dziennika

Program / scenariusz: cmd

Dodaj argumenty: /c run_with_default_port.bat > IMQuantWebServices.log

kevinarpe
źródło
5
Wygląda na to, że uruchamiasz usługę za pośrednictwem zaplanowanego zadania. Jeśli powinna to być usługa trwale działająca w tle, jako alternatywę należy spojrzeć na NSSM.
Uruchamia
43

>>Dołączy plik dziennika, a nie zastępowanie go za każdym razem. 2>&1Będzie również wysłać błędy do pliku dziennika.

cmd /c YourProgram.exe >> log.txt 2>&1
WhiteHotLoveTiger
źródło
39

Możesz mieć plik debug.cmd, który wywołuje yourscript.cmd

yourscript.cmd > logall.txt

planujesz debug.cmd zamiast yourscript.cmd

odnowić
źródło
11

Użyj cmd.exeprocesora poleceń, aby utworzyć nazwę pliku ze znacznikiem czasu, aby zarejestrować dane wyjściowe zaplanowanego zadania

Aby oprzeć się na odpowiedziach innych osób, może być konieczne utworzenie pliku wyjściowego z datą i / lub godziną osadzoną w nazwie pliku. Możesz to zrobić za pomocą cmd.exeprocesora poleceń.

Uwaga: Ta technika pobiera ciąg wyjściowy wewnętrznych zmiennych środowiskowych systemu Windows i dzieli je na kawałki na podstawie pozycji znaku. Z tego powodu dokładne wartości podane w poniższych przykładach mogą nie być poprawne dla używanego regionu systemu Windows. Ponadto, przy niektórych ustawieniach regionalnych, niektóre składniki daty lub godziny mogą wprowadzić spację do utworzonej nazwy pliku, gdy ich wartość jest mniejsza niż 10. Aby złagodzić ten problem, należy umieścić nazwę pliku w cudzysłowie, tak aby wszelkie niezamierzone spacje w pliku name nie zepsuje linii poleceń, którą tworzysz. Eksperymentuj i znajdź to, co najlepiej pasuje do Twojej sytuacji.

Pamiętaj, że PowerShelljest potężniejszy niż cmd.exe. Jednym ze sposobów jest to, że jest bardziej wydajny, ponieważ radzi sobie z różnymi regionami systemu Windows. Ale ta odpowiedź dotyczy rozwiązania tego problemu za pomocą cmd.exe, a nie PowerShell, więc kontynuujemy.

Za pomocą cmd.exe

Możesz uzyskać dostęp do różnych składników daty i godziny, wycinając wewnętrzne zmienne środowiskowe %date%i %time%, w następujący sposób (ponownie, dokładne wartości podziału zależą od regionu skonfigurowanego w systemie Windows):

  • Rok (4 cyfry): %date:~10,4%
  • Miesiąc (2 cyfry): %date:~4,2%
  • Dzień (2 cyfry): %date:~7,2%
  • Godzina (2 cyfry): %time:~0,2%
  • Minuta (2 cyfry): %time:~3,2%
  • Drugi (2 cyfry): %time:~6,2%

Załóżmy, że chcesz, aby plik dziennika został nazwany przy użyciu tego formatu daty / godziny: „ Log_[yyyyMMdd]_[hhmmss].txt”. Użyłbyś:

Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt

Aby to przetestować, uruchom następujący wiersz poleceń:

cmd.exe /c echo "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt"

Łącząc to wszystko razem, aby przekierować zarówno stdouti stderrze skryptu do pliku dziennika o nazwie z bieżącą datą i godziną, użyj poniższego wiersza poleceń:

cmd /c YourProgram.cmd > "Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1

Zwróć uwagę na użycie cudzysłowów wokół nazwy pliku w celu obsługi wystąpień składnika daty lub godziny może wprowadzić znak spacji.

W moim przypadku, jeśli bieżąca data / godzina to 10/05/2017 9:05:34 AM, powyższa linia poleceń wygeneruje:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1
STLDev
źródło
nie ma wiodącego zera w godzinach mniejszych niż 10: / nie wiem, jak to naprawić, ale przynajmniej
zacytuj
9

Możesz pisać do pliku dziennika w wierszach, które chcesz wyprowadzić w następujący sposób:

@echo off
echo Debugging started >C:\logfile.txt
echo More stuff
echo Debugging stuff >>C:\logfile.txt
echo Hope this helps! >>C:\logfile.txt

W ten sposób możesz wybrać, które polecenia mają być wyświetlane, jeśli nie chcesz przeglądać wszystkiego, po prostu uzyskaj to, co chcesz zobaczyć. >Wyjście będzie to do pliku podanego (tworząc plik, jeśli nie istnieje i zastąpieniem go, jeśli to robi). >>Dołączy do pliku podanego (tworząc plik, jeśli nie istnieje, ale dodanie do treści, jeśli nie).

Bali C.
źródło
2

Przykład jak uruchomić program i zapisać stdout i stderr do pliku z datownikiem:

cmd /c ""C:\Program Files (x86)\program.exe" -param fooo >> "c:\dir space\Log_%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.txt" 2>&1"

Kluczową częścią jest podwójne cytowanie całej części z tyłu, cmd /ca wewnątrz niej jak zwykle użyj podwójnych cudzysłowów. Należy również pamiętać, że data jest zależna od ustawień regionalnych, w tym przykładzie działa przy użyciu ustawień regionalnych dla Stanów Zjednoczonych.

David Navrkal
źródło
0

Ten fragment kodu używa wmic.exe do zbudowania ciągu daty. Nie jest zniekształcona przez ustawienia regionalne

rem DATE as YYYY-MM-DD via WMIC.EXE
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set datetime=%%I
set RDATE=%datetime:~0,4%-%datetime:~4,2%-%datetime:~6,2% 
jim brzoza
źródło