Bagaimana cara menangkap output dari skrip jika dijalankan oleh penjadwal tugas?


98

Menggunakan Windows Server 2008, bagaimana cara menangkap output dari skrip yang sedang dijalankan dengan penjadwal tugas windows?

Saya menguji skrip batch pencetakan kustom yang agak panjang, dan untuk tujuan debugging, saya ingin melihat semua output darinya setiap malam.


2
Kadang-kadang, ini tidak akan berhasil yaitu tidak ada file log yang dibuat. Salah satu skenario yang dapat menyebabkan hal ini adalah ketika tugas tidak dimulai sama sekali, karena Windows secara keliru menganggapnya masih berjalan. Anda dapat melacaknya dengan melihat riwayat tugas (tab riwayat di properti tugas - informasi mungkin memerlukan beberapa detik untuk muncul)
Daniel

Jawaban:


87

Coba ini sebagai string perintah di Penjadwal Tugas:

cmd /c yourscript.cmd > logall.txt

2
bagus, tidak perlu pembungkus, berfungsi dengan baik, dan juga mencatat keluaran dari skrip PowerShell anak yang dipanggil dari bat / cmd yang dipicu oleh penjadwal-tugas Terima kasih!
Jonesome Reinstate Monica

9
Selain itu, gunakan cmd /c "path with spaces/command.cmd > file.txt"jika Anda memiliki spasi. Jawaban 2>&1dari Ivan juga masuk ke dalam tanda kutip.
Dinei

3
perlu menggunakan tanda kutip ganda agar milik saya berfungsi: stackoverflow.com/a/6378038/1747983 cmd /c ""C:\temp\My test dir\something 123\myTool.exe" > Tilo_log.txt 2>&1"
Tilo

1
Saya tahu ini sudah 5 tahun, tetapi mengubahnya menjadi jawaban yang diterima karena menjadi cara minimalis dalam melakukan tugas.
Mechaflash

Sekarang saya memiliki jendela perintah yang muncul saat menjalankan tugas. Bagaimana cara mencegahnya?
Chris

58

Dengan stderr (tempat sebagian besar kesalahan terjadi):

cmd /c yourscript.cmd > logall.txt 2>&1

56

Untuk melengkapi jawaban @ user2744787, berikut adalah tangkapan layar untuk menunjukkan cara menggunakan cmddengan argumen dalam Tugas Terjadwal:

Output cmd Tugas Terjadwal ke logfile

Program / skrip: cmd

Tambahkan argumen: /c run_with_default_port.bat > IMQuantWebServices.log


5
Sepertinya Anda memulai layanan melalui tugas terjadwal. Jika ini adalah layanan yang terus berjalan di latar belakang, lihat NSSM sebagai alternatif. Ini menjalankan perintah apa pun sebagai layanan windows dan menangani restart setelah kegagalan dll.
leemes

43

Ini >>akan menambahkan file log, daripada menimpanya setiap kali. Ini 2>&1juga akan mengirimkan kesalahan ke file log Anda.

cmd /c YourProgram.exe >> log.txt 2>&1

40

Anda dapat memiliki debug.cmd yang memanggil yourscript.cmd

yourscript.cmd > logall.txt

Anda menjadwalkan debug.cmd alih-alih skripAnda.cmd


11

Gunakan cmd.exeprosesor perintah untuk membuat nama file dengan stempel waktu untuk mencatat keluaran tugas terjadwal Anda

Untuk membangun jawaban oleh orang lain di sini, mungkin Anda ingin membuat file keluaran yang memiliki tanggal dan / atau waktu yang disematkan dalam nama file. Anda dapat menggunakan cmd.exeprosesor perintah untuk melakukan ini untuk Anda.

Catatan: Teknik ini mengambil output string dari variabel lingkungan Windows internal dan memotongnya berdasarkan posisi karakter. Karenanya, nilai pasti yang diberikan dalam contoh di bawah ini mungkin tidak benar untuk wilayah Windows yang Anda gunakan. Selain itu, dengan beberapa pengaturan regional, beberapa komponen tanggal atau waktu dapat memasukkan spasi ke dalam nama file yang dibangun ketika nilainya kurang dari 10. Untuk mengurangi masalah ini, apit nama file Anda dengan tanda kutip sehingga ada spasi yang tidak diinginkan dalam file name tidak akan merusak baris perintah yang Anda buat. Bereksperimen dan temukan apa yang terbaik untuk situasi Anda.

Sadarilah bahwa PowerShelllebih kuat dari cmd.exe. Salah satu cara yang lebih kuat adalah dapat menangani wilayah Windows yang berbeda. Tapi jawaban ini tentang menyelesaikan masalah ini menggunakan cmd.exe, bukan PowerShell, jadi kami melanjutkan.

Menggunakan cmd.exe

Anda dapat mengakses berbagai komponen tanggal dan waktu dengan membagi variabel lingkungan internal %date%dan %time%, sebagai berikut (sekali lagi, nilai pembagian yang tepat bergantung pada wilayah yang dikonfigurasi di Windows):

  • Tahun (4 digit): %date:~10,4%
  • Bulan (2 digit): %date:~4,2%
  • Hari (2 digit): %date:~7,2%
  • Jam (2 digit): %time:~0,2%
  • Menit (2 digit): %time:~3,2%
  • Detik (2 digit): %time:~6,2%

Misalkan Anda ingin file log Anda diberi nama menggunakan format tanggal / waktu ini: " Log_[yyyyMMdd]_[hhmmss].txt". Anda akan menggunakan yang berikut ini:

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

Untuk mengujinya, jalankan baris perintah berikut:

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

Menyatukan semuanya, untuk mengarahkan keduanya stdoutdan stderrdari skrip Anda ke file log yang diberi nama dengan tanggal dan waktu saat ini, gunakan mungkin menggunakan yang berikut sebagai baris perintah Anda:

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

Perhatikan penggunaan tanda kutip di sekitar nama file untuk menangani contoh komponen tanggal atau waktu mungkin memperkenalkan karakter spasi.

Dalam kasus saya, jika tanggal / waktu saat ini adalah 10/05/2017 9:05:34 AM, baris perintah di atas akan menghasilkan yang berikut:

cmd /c YourProgram.cmd > "Log_20171005_ 90534.txt" 2>&1

tidak ada nol di depan pada jam kurang dari 10: / tidak yakin bagaimana memperbaikinya tetapi setidaknya mengutip nama file
user25064

9

Anda dapat menulis ke file log pada baris yang ingin Anda hasilkan seperti ini:

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

Dengan cara ini Anda dapat memilih perintah mana yang akan dikeluarkan jika Anda tidak ingin menelusuri semuanya, cukup dapatkan apa yang perlu Anda lihat. The >kemauan output ke file yang ditentukan (membuat file jika tidak ada dan Timpa jika tidak). The >>akan menambah ke file yang ditentukan (membuat file jika tidak ada tetapi menambahkan ke isi jika tidak).


2

Contoh bagaimana menjalankan program dan menulis stdout dan stderr ke file dengan timestamp:

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"

Bagian kuncinya adalah menggandakan seluruh bagian di belakang cmd /cdan di dalamnya gunakan tanda kutip ganda seperti biasa. Perhatikan juga bahwa tanggal bergantung pada lokal, contoh ini bekerja menggunakan lokal AS.


0

Cuplikan ini menggunakan wmic.exe untuk membuat string tanggal. Itu tidak rusak oleh pengaturan lokal

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% 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.