Bagaimana saya bisa menjalankan aplikasi baris perintah di command prompt Windows dan memiliki output yang ditampilkan dan diarahkan ke file pada saat yang sama?
Jika, misalnya, saya menjalankan perintah dir > test.txt
, ini akan mengarahkan output ke file yang dipanggil test.txt
tanpa menampilkan hasilnya.
Bagaimana saya bisa menulis perintah untuk menampilkan output dan mengarahkan output ke file di command prompt Windows, mirip dengan tee
perintah di Unix?
batch-file
cmd
stdout
tee
Edward Thomson
sumber
sumber
Jawaban:
Untuk memperluas jawaban davor , Anda dapat menggunakan PowerShell seperti ini:
Jika Anda mencoba mengarahkan output exe di direktori saat ini, Anda perlu menggunakan
.\
nama file, misalnya:sumber
dir
dalam powershell adalah aliasGet-ChildItem
yang tidak sepertidir
perintah internal cmd . Anda perlupowershell "cmd /c dir | tee test.txt"
jika Anda ingin versi internal cmd2>&1
, misalnyanode 2>&1 | tee debug_log.txt
Saya dapat menemukan solusi / solusi untuk mengarahkan ulang output ke file dan kemudian ke konsol:
di mana dir adalah perintah yang outputnya perlu diarahkan, a.txt file tempat menyimpan output.
sumber
&
alih - alih|
diperlukan untuk output dari beberapa perintah, sepertiping
atau7z.exe
dir
. Contoh:chkdsk /f c: > c:\Temp.txt | c:\Temp.txt
. File laporan sistem dikunci oleh proses lain.handle output to stderr
- Tambahkan2>&1
pengalihan jadi seperti ini:dir 2>&1 > a.txt & type a.txt
dan Anda harus memiliki stderr dicampur dengan stdout.Ada port Win32 dari
tee
perintah Unix , yang melakukan hal itu. Lihat http://unxutils.sourceforge.net/ atau http://getgnuwin32.sourceforge.net/sumber
tee
paket GnuWin32 , Anda akan menemukannya di gnuwin32.sourceforge.net/packages/coreutils.htm .Lihat ini: musim dingin
Tidak perlu untuk cygwin.
Saya menemukan dan melaporkan beberapa masalah.
Anda juga dapat memeriksa unxutils karena mengandung tee (dan tidak perlu untuk cygwin), tetapi berhati-hatilah karena keluaran EOL seperti UNIX di sini.
Terakhir, tetapi tidak kalah pentingnya, adalah jika Anda memiliki PowerShell, Anda dapat mencoba Tee-Object. Ketik
get-help tee-object
konsol PowerShell untuk info lebih lanjut.sumber
tee
menampilkan waktu nyata.wtee
memiliki fungsi yang sama. Jika Anda tidak keberatan dengan bug, itu akan baik-baik saja.@ tori3852
Saya menemukan itu
tidak berfungsi (beberapa baris pertama dari daftar dir saja - mencurigai semacam proses forking dan bagian kedua, perintah 'type' dihentikan sebelum daftar mengerikan selesai?), jadi alih-alih saya menggunakan:
yang melakukan - perintah berurutan, satu selesai sebelum yang kedua dimulai.
sumber
&
alih-alih&&
jika Anda ingin memastikantype
perintah dieksekusi bahkan jikadir
perintah gagal. Ini berguna ketika ada beberapa bentuk kesalahan dalam perintah Anda dan Anda masih ingin melihat file log di konsol. Lihat artikel Microsoft tentang ini . Namun, ini memiliki masalah%errorlevel%
diatur ke tingkat kesalahantype
(yang akan menjadi 0).Sayangnya tidak ada hal seperti itu.
Aplikasi konsol Windows hanya memiliki pegangan keluaran tunggal. (Yah, ada dua
STDOUT
,STDERR
tapi tidak masalah di sini)>
Pengalihan output biasanya ditulis ke pegangan konsol ke pegangan file.Jika Anda ingin memiliki semacam multiplexing, Anda harus menggunakan aplikasi eksternal yang dapat Anda alihkan hasilnya. Aplikasi ini kemudian dapat menulis ke file dan ke konsol lagi.
sumber
tee
pada * nix juga merupakan aplikasi yang terpisah, bukan pengalihan pada shellAplikasi konsol C # sederhana akan membantu:
Untuk menggunakan ini, Anda cukup mem-pipe perintah sumber ke dalam program dan memberikan path dari semua file yang Anda ingin duplikat output. Sebagai contoh:
Akan menampilkan hasil dir serta menyimpan hasilnya di files1.txt dan files2.txt.
Perhatikan bahwa tidak banyak (apa pun!) Dalam cara penanganan kesalahan di atas, dan mendukung banyak file mungkin sebenarnya tidak diperlukan.
sumber
Ini bekerja, meskipun agak jelek:
Ini sedikit lebih fleksibel daripada beberapa solusi lain, karena ia bekerja pernyataan demi pernyataan sehingga Anda dapat menggunakannya untuk menambahkan juga. Saya menggunakan ini cukup banyak dalam file batch untuk mencatat dan menampilkan pesan:
Ya, Anda bisa mengulangi pernyataan ECHO (satu kali untuk layar dan yang kedua kali mengarahkan ulang ke logfile), tetapi itu terlihat sama buruknya dan sedikit masalah pemeliharaan. Setidaknya dengan cara ini Anda tidak perlu membuat perubahan pada pesan di dua tempat.
Perhatikan bahwa _ hanya nama file pendek, jadi Anda harus memastikan untuk menghapusnya di akhir file batch Anda (jika Anda menggunakan file batch).
sumber
type
perintah pada baris terpisah (dalam subrutin) memperbaikinya.mtee adalah utilitas kecil yang berfungsi sangat baik untuk tujuan ini. Gratis, sumber terbuka, dan Hanya Bekerja.
Anda dapat menemukannya di http://www.commandline.co.uk .
Digunakan dalam file batch untuk menampilkan output DAN membuat file log secara bersamaan, sintaksanya terlihat seperti ini:
Di mana / + berarti untuk menambahkan output.
Ini mengasumsikan bahwa Anda telah menyalin mtee ke folder yang ada di PATH, tentu saja.
sumber
Saya ingin sedikit memperluas jawaban Saxon Druce .
Seperti yang dinyatakan, Anda dapat mengarahkan output dari executable di direktori saat ini seperti:
Namun, ini hanya masuk
stdout
ketest.txt
. Itu juga tidak masukstderr
.Solusi yang jelas adalah menggunakan sesuatu seperti ini:
Namun, ini tidak akan berhasil untuk semua
something.exe
. Beberapasomething.exe
akan menafsirkan2>&1
sebagai argumen dan gagal. Solusi yang benar adalah alih-alih hanya memiliki tanda kutip di sekitarsomething.exe
dan switch dan argumennya, seperti:sumber
'tee' is not recognized as an internal or external command
karena alasan yang jelas. Dengan2>&1
garis cmd di dalam, output apa pun ke stderr menyebabkan kesalahan dari PowerShell.Saya setuju dengan Brian Rasmussen, port unxutils adalah cara termudah untuk melakukan ini. Di bagian File Batch dari Halaman Scripting- nya Rob van der Woude menyediakan banyak informasi tentang penggunaan perintah MS-DOS dan CMD. Saya pikir dia mungkin memiliki solusi asli untuk masalah Anda dan setelah menggali di sana saya menemukan TEE.BAT , yang tampaknya hanya itu, implementasi bahasa batch MS-DOS dari tee. Ini adalah file batch yang terlihat cukup kompleks dan kecenderungan saya masih akan menggunakan port unxutils.
sumber
Jika Anda memiliki cygwin di jalur lingkungan Windows Anda, Anda dapat menggunakan:
sumber
dir 1>a.txt 2>&1 | type a.txt
Ini akan membantu mengarahkan ulang STDOUT dan STDERR
sumber
Saya tahu ini adalah topik yang sangat lama, tetapi dalam jawaban sebelumnya tidak ada implementasi penuh dari Tee waktu nyata yang ditulis dalam Batch. Solusi saya di bawah ini adalah skrip hybrid Batch-JScript yang menggunakan bagian JScript hanya untuk mendapatkan output dari perintah pipa, tetapi pemrosesan data dilakukan di bagian Batch. Pendekatan ini memiliki keuntungan bahwa setiap programmer Batch dapat memodifikasi program ini agar sesuai dengan kebutuhan spesifik. Program ini juga memproses dengan benar output dari perintah CLS yang dihasilkan oleh file Batch lain, yaitu, membersihkan layar ketika output perintah CLS terdeteksi.
sumber
file.exe 2>output.txt
file.exe 2>&1|tee.bat
seperti yang ditemukan di sini: superuser.com/questions/452763/…Saya juga mencari solusi yang sama, setelah mencoba sedikit, saya berhasil mencapai itu di Command Prompt. Inilah solusi saya:
Ia bahkan menangkap perintah PAUSE apa pun juga.
sumber
Berikut adalah contoh dari apa yang saya gunakan berdasarkan salah satu jawaban lain
sumber
Sesuatu seperti ini harus melakukan apa yang Anda butuhkan?
sumber
kirim output ke konsol, tambahkan ke konsol log, hapus output dari perintah saat ini
sumber
Ini adalah variasi pada jawaban sebelumnya oleh MTS, namun menambahkan beberapa fungsi yang mungkin berguna bagi orang lain. Berikut adalah metode yang saya gunakan:
set _Temp_Msg_Cmd=
^
karakter wortel sehingga perintah tidak dievaluasi pada awalnya%~n0_temp.txt
yang menggunakan sintaks ekstensi parameter baris perintah%~n0
untuk mendapatkan nama file batch.%~n0_log.txt
Berikut adalah urutan perintah:
^> %~n0_temp.txt 2^>^&1
^& type %~n0_temp.txt ^>^> %~n0_log.txt
^& type %~n0_temp.txt
^& del /Q /F %~n0_temp.txt
Berikut ini contohnya:
set _Temp_Msg_Cmd= ^> %~n0_temp.txt 2^>^&1 ^& type %~n0_temp.txt ^>^> %~n0_log.txt ^& type %~n0_temp.txt ^& del /Q /F %~n0_temp.txt
Dengan cara ini maka perintah dapat ditambahkan setelah perintah selanjutnya dalam file batch yang terlihat jauh lebih bersih:
echo test message %_Temp_Msg_Cmd%
Ini dapat ditambahkan ke akhir perintah lain juga. Sejauh yang saya tahu itu akan berfungsi ketika pesan memiliki beberapa baris. Sebagai contoh, perintah berikut menghasilkan dua baris jika ada pesan kesalahan:
net use M: /D /Y %_Temp_Msg_Cmd%
sumber
Ini akan membuat file log dengan datetime saat ini dan Anda bisa konsol baris selama proses
sumber
Saya menggunakan batch subroutine dengan pernyataan "untuk" untuk mendapatkan output perintah satu baris pada satu waktu dan keduanya menulis baris itu ke file dan output ke konsol.
sumber
Jika Anda menggunakan CLI, mengapa tidak menggunakan loop FOR untuk "DO" apa pun yang Anda inginkan:
Sumber daya hebat pada Windows CMD untuk loop: https://ss64.com/nt/for_cmd.html Kuncinya di sini adalah mengatur delimeter (delims), yang akan memecah setiap baris output, menjadi nol. Dengan cara ini tidak akan merusak default white-space. % A adalah huruf arbitrer, tetapi digunakan di bagian "do" untuk, well ... melakukan sesuatu dengan karakter yang diuraikan pada setiap baris. Dalam hal ini kita dapat menggunakan ampersand (&&) untuk menjalankan perintah gema ke-2 untuk membuat-atau-menambahkan (>>) ke file pilihan kita. Lebih aman untuk menjaga urutan perintah DO ini jika ada masalah saat menulis file, setidaknya kita akan mendapatkan gema ke konsol terlebih dahulu. Tanda at (@) di depan gema pertama menekan konsol agar tidak menampilkan perintah gema itu sendiri, dan sebagai gantinya hanya menampilkan hasil perintah yang menampilkan karakter dalam% a.
UPDATE: / F melewatkan baris kosong dan hanya memperbaiki adalah untuk pra-filter output menambahkan karakter ke setiap baris (mungkin dengan nomor baris melalui perintah find). Memecahkan ini dalam CLI tidak cepat atau cantik. Selain itu, saya tidak memasukkan STDERR, jadi ini juga menangkap kesalahan:
Mengarahkan Pesan Kesalahan
Tanda sisipan (^) ada untuk melarikan diri dari simbol setelah mereka, karena perintah adalah string yang sedang ditafsirkan, sebagai lawan untuk mengatakan, memasukkannya langsung pada baris perintah.
sumber
Sama seperti unix.
dir | tee a.txt
Tidak berfungsi Di windows XP, itu perlu
mksnt
diinstal.Ini ditampilkan pada prompt serta menambahkan ke file.
sumber
Mengikuti ini membantu jika Anda menginginkan sesuatu yang benar-benar terlihat di layar - bahkan jika file batch dialihkan ke file. Perangkat CON mungkin digunakan juga jika diarahkan ke file
Contoh:
Lihat juga deskripsi pengalihan yang baik: http://www.p-dd.com/chapter7-page14.html
sumber
Anda dapat menemukan perintah-perintah ini dalam biterscripting ( http://www.biterscripting.com ) bermanfaat.
sumber
Ini bekerja secara real time tetapi juga agak jelek dan kinerjanya lambat. Tidak diuji dengan baik:
sumber
%MYCOMMAND%
selesai dan gagal dalam banyak kasus. Itu melompat baris kosong, baris yang dimulai dengan;
gagal dengan konten seperti<space>/<TAB>
,ON
,OFF
atau/?
. Tetapi sisanya kadang-kadang bisa bekerja :-)Alternatifnya adalah tee stdout ke stderr dalam program Anda:
di java:
Kemudian, dalam dos batchfile Anda:
java program > log.txt
Stdout akan menuju ke file log dan stderr (data yang sama) akan ditampilkan di konsol.
sumber
Saya menginstal perl pada sebagian besar mesin saya jadi jawaban menggunakan perl: tee.pl
dir | perl tee.pl atau dir | perl tee.pl dir.bat
kasar dan belum teruji.
sumber
Variasi lain adalah dengan membagi pipa, dan kemudian mengarahkan kembali output yang Anda inginkan.
Simpan di atas ke file .bat. Ini membagi output teks pada filestream 1 ke filestream 3 juga, yang Anda dapat mengarahkan sesuai kebutuhan. Dalam contoh saya di bawah ini, saya menyebut script di atas splitPipe.bat ...
sumber
c:\cygwin64\bin\script.exe
dan masukkancmd
dan masukkanexit
dan masukkan (keluar dari cmd.exe Cygwin)exit
dan masukkan (keluar dari script.exe Cygwin)sumber