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?
windows
command-line
cmd
pipe
ripper234
sumber
sumber
Jawaban:
Kamu ingin:
Sintaks
2>&1
akan mengarahkan2
(stderr) ke1
(stdout). Anda juga dapat menyembunyikan pesan dengan mengarahkan kembali keNUL
, lebih banyak penjelasan dan contoh di MSDN .sumber
net stop w3svc >NUL 2>&1
.. terima kasih!2> 2.txt
karya (atau2> &1
)2 > 2.txt
tidak;2 > &1
tidak.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>&1
ditentukan SETELAH yang1>
redirect, jika tidak maka tidak akan bekerja.sumber
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.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
sumber
Untuk menambahkan stdout dan stderr ke file log umum skrip:
sumber
>>
menambahkan ke file mana>
menimpa file.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 oleh2>
.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 ...
sumber
Namun, tidak ada jaminan bahwa output
SDTOUT
danSTDERR
jalinan baris demi baris dalam waktu yang tepat, menggunakanPOSIX
redirect 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
sumber
Dalam file batch (Windows 7 dan di atas) saya menemukan metode ini paling dapat diandalkan
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.
sumber
>con echo This goes to screen
Juga berguna untuk input pengguna>con set /p "var="Input: "
Catatan: garis-garis itu hanya akan muncul di layar dan tidak diarahkan ke file.