Saya memiliki skrip batch yang menjalankan tugas dan mengirimkan hasilnya ke file teks. Apakah ada cara untuk menampilkan output di jendela konsol juga?
Sebagai contoh:
c:\Windows>dir > windows-dir.txt
Apakah ada cara untuk memiliki keluaran dir
tampilan di jendela konsol serta memasukkannya ke dalam file teks?
windows
batch-file
cmd
JamesEggers
sumber
sumber
Jawaban:
Tidak, Anda tidak bisa dengan pengalihan murni.
Tetapi dengan beberapa trik (seperti tee.bat ) Anda bisa.
Saya mencoba menjelaskan pengalihan sedikit.
Anda mengarahkan salah satu dari sepuluh aliran dengan > file atau <file
Itu tidak penting, jika pengalihan sebelum atau sesudah perintah, jadi kedua baris ini hampir sama.
Pengalihan dalam contoh ini hanya pintasan untuk 1> , ini berarti aliran 1 (STDOUT) akan dialihkan.
Jadi Anda dapat mengarahkan aliran apa pun dengan nomor sebelumnya seperti 2> err.txt dan juga diperbolehkan untuk mengarahkan beberapa aliran dalam satu baris.
Dalam contoh ini, "keluaran standar" akan masuk ke files.txt, semua kesalahan akan ada di err.txt dan stream3 akan masuk ke nothing.txt (DIR tidak menggunakan aliran 3).
Stream0 adalah STDIN
Stream1 adalah STDOUT
Stream2 adalah STDERR
Stream3-9 tidak digunakan
Tetapi apa yang terjadi jika Anda mencoba mengalihkan aliran yang sama beberapa kali?
"Hanya ada satu", dan itu selalu yang terakhir!
Jadi sama dengan dir> two.txt
Oke, ada satu kemungkinan tambahan, mengalihkan aliran ke aliran lain.
2> & 1 mengalihkan aliran2 ke aliran1 dan 1> files.txt mengarahkan semua ke files.txt .
Urutan penting di sini!
berbeda. Yang pertama mengalihkan semua (STDOUT dan STDERR) ke NUL,
tetapi baris kedua mengalihkan STDOUT ke NUL dan STDERR ke STDOUT "kosong".
Sebagai satu kesimpulan, jelas mengapa contoh Otávio Décio dan andynormancx tidak dapat bekerja.
Keduanya mencoba mengalihkan aliran1 dua kali, tetapi "Hanya ada satu", dan itu selalu yang terakhir.
Jadi Anda mengerti
Dan pada contoh pertama, pengalihan stream1 ke stream1 tidak diperbolehkan (dan tidak terlalu berguna).
Semoga membantu.
sumber
3<&2
(perhatikan LT, bukan GT), dan kemudian3>errors.txt
. Tetapi ini berakhir dengan buruk - semua output stderr berikutnya ditangkap keerrors.txt
(yaitu - dari perintah lain juga!).Cukup gunakan versi Windows dari perintah tee UNIX (ditemukan dari http://unxutils.sourceforge.net ) dengan cara ini:
Jika Anda juga membutuhkan keluaran STDERR, gunakan yang berikut ini.
The
2>&1
menggabungkan output stderr ke STDOUT (streaming utama).sumber
1>tee a.txt
akan mengarahkan stdout ke file bernamatee
alih-alih memanggiltee
perintah. Adakah yang bisa memastikan bahwa jawaban ini berhasil untuk mereka?Jika Anda tidak memerlukan output secara real time (misalnya saat program menulisnya), Anda dapat menambahkan
setelah garis itu.
sumber
dir > windows-dir.txt & type windows-dir.txt
. Ini juga berlaku untuk blok:( echo %date% <NL> echo %username% <NL> echo %time% <NL> pause>CON )>test.txt & type test.txt
. Namun, jika output diperlukan secara real time, Anda dapat menggunakan misalnya port windows alat tee untuk itu…Solusi yang berhasil untuk saya adalah: dir> a.txt | ketik a.txt .
sumber
Ya, ada cara untuk menampilkan satu output perintah di konsol (layar) dan di file. Menggunakan contoh Anda, gunakan ...
Penjelasan detail:
Itu
FOR
perintah mem-parsing output dari perintah atau teks ke dalam variabel, yang dapat dirujuk beberapa kali.Untuk perintah, seperti
DIR /B
, apit dalam tanda kutip tunggal seperti yang ditunjukkan pada contoh di bawah ini. GantiDIR /B
teks dengan perintah yang Anda inginkan.Untuk menampilkan teks, apit teks dalam tanda kutip ganda seperti yang ditunjukkan pada contoh di bawah ini.
... Dan dengan pembungkus garis ...
Jika Anda memiliki waktu di mana Anda ingin output hanya di konsol (layar), dan waktu lain hanya dikirim ke file, dan waktu lain dikirim ke keduanya, tentukan klausa "DO" dari loop FOR menggunakan variabel, seperti yang ditunjukkan di bawah ini dengan
%TOECHOWHERE%
.sumber
delims=
sebagai gantinya.sumber
Jika Anda ingin menambahkan alih-alih mengganti file keluaran, Anda mungkin ingin menggunakan
atau
sumber
Pilihan saya adalah ini:
Buat subrutin yang menerima pesan dan mengotomatiskan proses pengirimannya ke konsol dan file log.
Jika Anda menambahkan variabel ke pesan, pastikan untuk menghapus tanda kutip di dalamnya sebelum mengirimkannya ke subrutin atau dapat mengacaukan batch Anda. Tentu saja ini hanya berfungsi untuk gema.
sumber
setlocal enabledelayedexpansion
bukan hanyasetlocal
2) Saya menggunakan ekspansi tertunda untuk variabel logfile, jadi>> !logfile!
alih-alih>> %logfile%
dalam subrutin. Dengan cara ini, ini berfungsi ketika dipanggil dari dalam blok kode (seperti dalam pernyataan if). 3) Saya menghapus baris "set message" karena tidak perlu variabel tambahan. Kami sudah memilikinya$~1
jadi saya punyaecho $~1
untuk kedua perintah gema.Saya membuat konsol C # sederhana yang dapat menangani output real-time ke layar cmd dan log
Penggunaan file batch sama dengan cara Anda menggunakan Unix
tee
Dan inilah repositori yang menyertakan Tee.exe jika Anda tidak memiliki alat untuk mengompilasi https://github.com/iamshiao/Tee
sumber
Saya suka jawaban atn, tapi tidak sepele bagi saya untuk mendownload seperti wintee , yang juga open source dan hanya memberikan fungsionalitas tee (berguna jika Anda hanya ingin tee dan bukan seluruh rangkaian utilitas unix). Saya belajar tentang ini dari jawaban davor untuk Menampilkan output prompt perintah Windows dan mengarahkannya ke file , di mana Anda juga menemukan referensi ke utilitas unix.
sumber
Solusi yang disediakan oleh "Tomas R" bekerja sempurna untuk pertanyaan OP dan tersedia secara native.
Coba: chkdsk c:> output.txt | ketik output.txt
Output dari perintah ini melibatkan persentase penyelesaian yang mendapatkan output secara serial ke file sehingga akan terlihat agak berantakan (yaitu teks akan ditambahkan saat proses berlangsung). Ini tidak terjadi pada bit yang mendapatkan output ke STDOUT (layar). Begitulah jadinya jika Anda hanya melakukan perintah yang sama tanpa pengalihan.
sumber
Saya pikir Anda menginginkan sesuatu seperti ini:
Atau jika Anda menginginkan baris baru:
Perintah ini bagus untuk log.
Catatan: Ini terkadang kesalahan dan mengganti seluruh file teks di komputer saya.
Catatan Lain: Jika file tidak ada, itu akan membuat file.
sumber
>
ini dirancang untuk menimpa file Gunakan.>>
Untuk menambahkan )