Redirect Windows cmd stdout dan stderr ke satu file

688

Saya mencoba mengarahkan semua output (stdout + stderr) dari perintah DOS ke satu file:

C:\>dir 1> a.txt 2> a.txt
The process cannot access the file because it is being used by another process.

Apakah mungkin, atau haruskah saya mengarahkan ulang ke dua file terpisah?

ripper234
sumber
14
TechNet: Menggunakan operator pengalihan perintah (jawaban ini lebih baik daripada jawaban di sini).
Martin Prikryl
1
2> & 1 karena tidak dapat membuka kembali file yang sama
Luke

Jawaban:

1090

Kamu ingin:

dir > a.txt 2>&1

Sintaks 2>&1akan mengarahkan 2(stderr) ke 1(stdout). Anda juga dapat menyembunyikan pesan dengan mengarahkan kembali ke NUL, lebih banyak penjelasan dan contoh di MSDN .

Anders Lindahl
sumber
32
terima kasih untuk ini, tidak tahu bahwa sintaks unix shell ini berfungsi untuk DOS juga!
chaindriver
20
ini bagus untuk menyembunyikan semua output net stop w3svc >NUL 2>&1.. terima kasih!
wasatchwizard
3
@wasatchwizard Ithink Saya mengalami masalah dengan itu, tetapi> NUL 2> NUL bekerja dengan baik
FrinkTheBrave
13
Jika ada Pegangan, tidak mungkin ada ruang antara Pegangan (yaitu 2) dan operator pengalihan (yaitu>). Karenanya 2> 2.txtkarya (atau 2> &1) 2 > 2.txttidak; 2 > &1tidak.
The Red Pea
9
Saya sangat mencintai SO. "Ugh, masalah kecil ini akan memakan waktu satu jam". Saya perlu waktu lebih lama untuk mengetik komentar ini daripada menemukan jawaban ini.
Brandon
195

Jawaban Anders Lindahl adalah benar, tetapi perlu dicatat bahwa jika Anda mengarahkan stdout ke file dan ingin mengarahkan stderr juga maka Anda harus memastikan bahwa 2>&1ditentukan SETELAH yang 1>redirect, jika tidak maka tidak akan bekerja.

REM *** WARNING: THIS WILL NOT REDIRECT STDERR TO STDOUT ****
dir 2>&1 > a.txt
DelboyJay
sumber
10
SETELAH itulah yang menghabiskan waktu berjam-jam untuk mencari tahu apa yang salah DelboyJay! Terima kasih!
Nam G VU
4
Apakah dijelaskan di mana pun mengapa menempatkan 2> & 1 sebelum 1> tidak akan mencapai efek yang diinginkan? Saya sangat curiga ini ada hubungannya dengan cara "cmd" mem-parsing perintah yang memberikan dua arti berbeda tergantung pada urutan di mana Anda menentukan pengalihan. Tetapi apakah aturan semantik didokumentasikan di mana saja karena saya rasa ini adalah sesuatu yang berharga untuk dipelajari karena dapat menghabiskan waktu berjam-jam.
igbgotiz
12
@igbgotiz 2> & 1 berarti 'redirect stream 2 ke stream 1'. Jadi, Anda perlu mengatur streaming 1 dulu
FrinkTheBrave
3
@FrinkTheBrave tetapi streaming 1 adalah output standar (misalnya konsol) jika tidak ditentukan secara eksplisit. Itu masih belum menjelaskannya kepada saya.
MarioDS 3-15
1
@MDeSchaepmeester, jika Anda melakukannya dir 2>&1 > a.txt, pertama-tama Anda mengarahkan ulang ( >) stream 2 (stderr) ke streaming 1 (stdout). Kemudian, setelah keduanya bergabung, Anda mengarahkan ulang stdout ( >tanpa specifier) ​​ke file. Jika Anda ingin stderr pergi ke tempat lain, Anda tidak dapat bergabung dengan stdout terlebih dahulu.
cp.engr
80

Info latar belakang dari MSKB

Walaupun jawaban yang diterima untuk pertanyaan ini benar, itu benar-benar tidak banyak menjelaskan mengapa itu bekerja, dan karena sintaksnya tidak segera jelas saya melakukan google cepat untuk mencari tahu apa yang sebenarnya terjadi. Dengan harapan informasi ini bermanfaat bagi orang lain, saya mempostingnya di sini.

Diambil dari Dukungan MS KB 110930 .


Dari MSKB110930

Mengarahkan Pesan Kesalahan dari Prompt Perintah: STDERR / STDOUT

Ringkasan

Saat mengarahkan output dari aplikasi menggunakan simbol '>', pesan kesalahan masih dicetak ke layar. Ini karena pesan kesalahan sering dikirim ke aliran Galat Standar alih-alih aliran Keluaran Standar.

Keluaran dari aplikasi atau perintah konsol (Command Prompt) sering dikirim ke dua aliran terpisah. Output reguler dikirim ke Standard Out (STDOUT) dan pesan kesalahan dikirim ke Standard Error (STDERR). Saat Anda mengarahkan output konsol menggunakan simbol ">", Anda hanya mengarahkan STDOUT. Untuk mengarahkan STDERR, Anda harus menentukan '2>' untuk simbol pengalihan. Ini memilih aliran output kedua yaitu STDERR.

Contoh

Perintah dir file.xxx(di mana file.xxxtidak ada) akan menampilkan output berikut:

Volume in drive F is Candy Cane Volume Serial Number is 34EC-0876

File Not Found

Jika Anda mengarahkan output ke NULperangkat menggunakan dir file.xxx > nul, Anda masih akan melihat bagian pesan kesalahan dari output, seperti ini:

File Not Found

Untuk mengarahkan (hanya) pesan kesalahan ke NUL, gunakan perintah berikut:

dir file.xxx 2> nul

Atau, Anda dapat mengarahkan output ke satu tempat, dan kesalahan ke yang lain.

dir file.xxx > output.msg 2> output.err

Anda dapat mencetak kesalahan dan output standar ke satu file dengan menggunakan perintah "& 1" untuk mengalihkan output untuk STDERR ke STDOUT dan kemudian mengirimkan output dari STDOUT ke file:

dir file.xxx 1> output.msg 2>&1
StormeHawke
sumber
29

Untuk menambahkan stdout dan stderr ke file log umum skrip:

dir >> a.txt 2>&1
Henk Wiersema
sumber
9
The >>menambahkan ke file mana >menimpa file.
delliottg
13

Benar, file handle 1 untuk prosesnya adalah STDOUT, dialihkan oleh 1>atau oleh >(1 dapat dihilangkan, dengan konvensi, perintah interpreter [cmd.exe] tahu untuk mengatasinya). Pegangan file 2 adalah STDERR, dialihkan oleh 2>.

Perhatikan bahwa jika Anda menggunakan ini untuk membuat file log, maka kecuali Anda mengirim outut ke _uniquely_named_ (mis. Tanggal-dan-waktu-dicap) file log, maka jika Anda menjalankan proses yang sama dua kali, yang dialihkan akan menimpa ( ganti) file log sebelumnya.

The >>(baik untuk STDOUT atau stderr) akan APPEND tidak REPLACE file. Jadi Anda mendapatkan logfile kumulatif, menunjukkan hasil dari semua proses yang berjalan - biasanya lebih bermanfaat.

Selamat jalan ...

Max Vitesse
sumber
2

Namun, tidak ada jaminan bahwa output SDTOUTdan STDERRjalinan baris demi baris dalam waktu yang tepat, menggunakan POSIXredirect merge syntax.

Jika aplikasi menggunakan output buffered, mungkin terjadi bahwa teks dari satu aliran dimasukkan di aliran lain di batas buffer, yang mungkin muncul di tengah-tengah baris teks.

Logger keluaran konsol khusus (yaitu "StdOut/StdErr Logger"oleh 'LoRd MuldeR') mungkin lebih dapat diandalkan untuk tugas seperti itu.

Lihat: Proyek OpenSource MuldeR

LigH
sumber
0

Dalam file batch (Windows 7 dan di atas) saya menemukan metode ini paling dapat diandalkan

Call :logging >"C:\Temp\NAME_Your_Log_File.txt" 2>&1
:logging
TITLE "Logging Commands"
ECHO "Read this output in your log file"
ECHO ..
Prompt $_
COLOR 0F

Jelas, gunakan perintah apa pun yang Anda inginkan dan hasilnya akan diarahkan ke file teks. Menggunakan metode ini dapat diandalkan NAMUN tidak ada output di layar.

PanamaPHat
sumber
(pada dasarnya jawaban yang sama diberikan beberapa kali tahun lalu.) Anda dapat memaksa output ke layar dengan >con echo This goes to screenJuga berguna untuk input pengguna >con set /p "var="Input: "Catatan: garis-garis itu hanya akan muncul di layar dan tidak diarahkan ke file.
Stephan