Log seluruh output file batch

11

Saya menggunakan skrip baris perintah untuk menyesuaikan beberapa pengaturan di komputer. Namun, saya ingin seluruh output juga akan login ke file .txt atau .log.

Ketika saya menggunakan pengetahuan dasar saya tentang sistem logging itu akan menempatkan output dalam file tetapi tidak benar-benar menjalankannya. Dalam kasus saya, saya akan membutuhkannya dieksekusi dan kemudian login ke file untuk referensi nanti.

Adakah yang bisa memberi tahu saya cara melakukan ini?

Terima kasih sebelumnya! Dempsey

Dempsey FoxDie Van Assche
sumber
Anda bahkan belum menentukan sistem operasi!
Michael Hampton

Jawaban:

10

Jika pertanyaan meminta skrip untuk "dieksekusi" dan seluruh file batch menjadi output ke file log di Windows 8.1, maka di sini adalah jawaban sederhana:

Sertakan ini di awal file batch Anda ...

@echo off
set LOGFILE=batch.log
call :LOG > %LOGFILE%
exit /B

:LOG
[ your script goes here ]
Ingrid
sumber
Luar biasa terima kasih! (Tentu saja,% LOGFILE% tidak benar-benar dibutuhkan di sini.: P)
Andrew
1
Skrip saya mengajukan pertanyaan - Saya tidak melihatnya jika ini digunakan. Bagaimana cara mencatat semuanya dan melihatnya di layar saat menjalankan?
Simon
Ya, bagaimana Anda melakukan itu sehingga Anda bisa melihatnya ketika sedang di layar Anda?
karl-police
3

Dalam pertanyaan Anda, Anda menyebutkan:

"... itu akan menempatkan output dalam file tetapi tidak benar-benar menjalankannya. Dalam kasus saya, saya akan membutuhkannya dieksekusi dan kemudian login ke file untuk referensi nanti."

Karena Anda mengatakan program sedang berjalan dan hasilnya dimasukkan ke dalam file, saya pikir Anda mungkin berarti "ditampilkan" , bukan "dieksekusi" .

Jika itu bukan yang Anda maksudkan, maka mungkin akan membantu jika itu dijelaskan lebih baik, mungkin dengan beberapa sampel output.

Bagaimanapun, saya memposting jawaban ini jika ada orang lain yang menemukan pertanyaan / jawaban ini bermanfaat.

Jadi, pada dasarnya, sepertinya Anda ingin output skrip ditangkap ke file, dan juga dapat melihat output skrip di layar saat skrip sedang berjalan.

(tl; versi dr: gunakan musim dingin , seperti ini:

script 2>&1 | wtee logfile.txt)


Untuk posting ini, saya akan menggunakan file batch uji kecil, tetapi skrip Anda bisa sebesar dan rumit atau sesederhana yang Anda butuhkan:

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.


Inilah yang terjadi ketika saya menjalankan skrip kumpulan ini:

C:\>a.cmd
Command: "dir /b a*"
a.cmd

Command: "dir /b non-existant-file"
File Not Found

Perhatikan bahwa dalam skrip pengujian, eksekusi pertama dari perintah "dir" berhasil, dan yang kedua gagal. Saya melakukan ini hanya untuk menunjukkan apa yang akan terjadi dengan "pesan kesalahan" ketika Anda menjalankan skrip Anda.

Jika saya menjalankan skrip dan menggunakan pengalihan ( ">" ) untuk menangkap output, saya akan melihat ini

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:\>

Perhatikan pesan kesalahan "File Tidak Ditemukan" ditampilkan di layar ketika skrip dijalankan, dan tidak benar-benar ditangkap ke dalam file. Itu karena ">" menangkap "output normal" yang telah dikirim ke aliran STDOUT. "Pesan kesalahan" biasanya dikirim ke aliran STDERR.

Untuk menangkap "output normal" dan "pesan kesalahan", Anda juga perlu menangkap aliran STDERR, yang ditunjukkan oleh "2" di "2> & 1" pada perintah di sini:

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

Di unix, ada perintah standar: "tee"

Menggunakan perintah "tee", Anda dapat menangkap output dari suatu program, dan juga menampilkan output ke layar, pada saat yang sama.

Perintah "tee" tidak standar dengan windows, tetapi Anda dapat mengunduh versi "tee" gratis untuk windows di sini: wintee . Program ini diunduh bernama: "wtee.exe".

Anda menggunakan program "wtee.exe" seperti yang ditunjukkan di bawah ini.

Ini akan menangkap output skrip ke file bernama "log.txt"seperti sebelumnya, dan itu juga akan menampilkan output ke layar saat skrip sedang berjalan:

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
Kevin Fegan
sumber
0

Script ini akan menjalankan ls dan mencatat hasilnya ke file bernama log.txt:

exec >log.txt 2>&1
ls

Log tidak akan dieksekusi.

Thorsten Staerk
sumber
1
Perhatikan bahwa ini mengasumsikan Unix / Linux, tetapi dugaan saya adalah pembicaraan OP tentang Windows. Ini juga tidak menjalankan skrip, tetapi mencatat output dari perintah yang Anda masukkan dan menghilangkan informasi penting tentang cara menghentikan kegilaan ...
Sven
Saya memang berbicara tentang Windows. Terima kasih :)
Dempsey FoxDie Van Assche