Menampilkan output command prompt Windows dan mengarahkannya ke file

371

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.txttanpa menampilkan hasilnya.

Bagaimana saya bisa menulis perintah untuk menampilkan output dan mengarahkan output ke file di command prompt Windows, mirip dengan teeperintah di Unix?

Edward Thomson
sumber
63
Dan tolong berhenti menyebutnya MSDOS! Kesamaan antara cmd.exe dan braindead command.com sangat kecil, dan semakin kecil.
paxdiablo
Tak satu pun dari ini bekerja jika seseorang memiliki aplikasi konsol yang memuat dll yang menghasilkan teks. Teks aplikasi utama akan dialihkan ke file tetapi output dari dll tidak dan terus ditampilkan di jendela konsol. Saya telah menemukan TIDAK cara untuk menangkap teks dari dll.
Brian Reinhold
1
seseorang masih bisa saja
mem-
Bagaimana jika saya menggunakan utilitas baris perintah dan ingin mengarahkan output ke file dalam format yang sama persis seperti yang ditampilkan di layar saya menggunakan youtube-dl untuk mengekstrak tautan dan dapat mengarahkan output ke file txt, tetapi tidak diformat sebagai Anda akan mendapatkan prompt, dalam file yang datang sebagai satu baris.
beastboy

Jawaban:

153

Untuk memperluas jawaban davor , Anda dapat menggunakan PowerShell seperti ini:

powershell "dir | tee test.txt"

Jika Anda mencoba mengarahkan output exe di direktori saat ini, Anda perlu menggunakan .\nama file, misalnya:

powershell ".\something.exe | tee test.txt"
Saxon Druce
sumber
8
Ini adalah jawaban yang paling dekat: ini bekerja pada instalasi default, karena PS sudah ada di sebagian besar mesin dan, terutama, server.
Stoleg
1
Ini jawaban terbaik! Sederhana dan bekerja "di luar kotak"
Josh Werts
3
SEPERTI ITU :) Bagaimanapun {powershell "ping -n 10 localhost | tee test.txt"} akan menunjukkan apa yang terjadi pada pesta tee
grenix
4
perhatikan bahwa dirdalam powershell adalah alias Get-ChildItemyang tidak seperti dirperintah internal cmd . Anda perlu powershell "cmd /c dir | tee test.txt"jika Anda ingin versi internal cmd
phuclv
8
untuk melihat semua output, jangan lupa untuk mengarahkan ulang STDERR ke STDOUT dengan 2>&1, misalnyanode 2>&1 | tee debug_log.txt
Zhe Hu
132

Saya dapat menemukan solusi / solusi untuk mengarahkan ulang output ke file dan kemudian ke konsol:

dir > a.txt | type a.txt

di mana dir adalah perintah yang outputnya perlu diarahkan, a.txt file tempat menyimpan output.

NSPKUWCExi2pr8wVoGNk
sumber
100
Ini memuaskan jawabannya, tetapi mengeluarkan data setelah perintah dir selesai daripada saat data diproduksi.
Leigh Riffel
10
ini akan bekerja, tetapi Anda akan mandek jika perintah menunggu input dari stdin.
Vitim.us
5
Saya suka jawaban sederhana ini! Saya menemukan bahwa &alih - alih |diperlukan untuk output dari beberapa perintah, seperti pingatau7z.exe
Wes Larson
Tidak bekerja untuk perintah interaktif dir. Contoh: chkdsk /f c: > c:\Temp.txt | c:\Temp.txt. File laporan sistem dikunci oleh proses lain.
Sopalajo de Arrierez
4
@lii re: handle output to stderr- Tambahkan 2>&1pengalihan jadi seperti ini: dir 2>&1 > a.txt & type a.txtdan Anda harus memiliki stderr dicampur dengan stdout.
Jesse Chisholm
97

Ada port Win32 dari teeperintah Unix , yang melakukan hal itu. Lihat http://unxutils.sourceforge.net/ atau http://getgnuwin32.sourceforge.net/

Brian Rasmussen
sumber
17
Tautan menunjuk ke implementasi Windows dari tee perintah Unix, jadi itu berfungsi pada Windows.
Brian Rasmussen
3
Ya, memilih jawaban dan komentar. Saya sebenarnya lebih suka CygWin karena memiliki segalanya tetapi beberapa orang lebih suka alat non-DLL yang dapat mereka pilih.
paxdiablo
3
Banyak utilitas Unix juga diangkut oleh proyek GnuWin32, lihat gnuwin32.sourceforge.net .
VladV
2
UnxUtils terakhir diperbarui pada tahun 2003; GnuWin32 sedikit lebih up-to-date.
quack quixote
9
Jika Anda, seperti saya, berjuang untuk menemukan teepaket GnuWin32 , Anda akan menemukannya di gnuwin32.sourceforge.net/packages/coreutils.htm .
Nigel Touch
49

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-objectkonsol PowerShell untuk info lebih lanjut.

Davor Josipovic
sumber
4
Mengapa memilih bawah? 95% dari balasan di sini memiliki satu kesamaan: output diarahkan hanya setelah perintah awal selesai: baca komentar. Utilitas UNIX teemenampilkan waktu nyata. wteememiliki fungsi yang sama. Jika Anda tidak keberatan dengan bug, itu akan baik-baik saja.
Davor Josipovic
Itu satu-satunya solusi yang bekerja untuk saya, tidak memiliki Powershell> 4.0. Jempolan!
Alex
46

@ tori3852

Saya menemukan itu

dir > a.txt | type a.txt

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:

dir > z.txt && type z.txt

yang melakukan - perintah berurutan, satu selesai sebelum yang kedua dimulai.

Andy Welch
sumber
17
Anda harus menggunakan &alih-alih &&jika Anda ingin memastikan typeperintah dieksekusi bahkan jika dirperintah 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 kesalahan type(yang akan menjadi 0).
ADTC
25

Sayangnya tidak ada hal seperti itu.

Aplikasi konsol Windows hanya memiliki pegangan keluaran tunggal. (Yah, ada dua STDOUT, STDERRtapi 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.

Daniel Rikowski
sumber
3
teepada * nix juga merupakan aplikasi yang terpisah, bukan pengalihan pada shell
phuclv
22

Aplikasi konsol C # sederhana akan membantu:

using System;
using System.Collections.Generic;
using System.IO;

namespace CopyToFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            var buffer = new char[100];
            var outputs = new List<TextWriter>();

            foreach (var file in args)
                outputs.Add(new StreamWriter(file));

            outputs.Add(Console.Out);

            int bytesRead;
            do
            {
                bytesRead = Console.In.ReadBlock(buffer, 0, buffer.Length);
                outputs.ForEach(o => o.Write(buffer, 0, bytesRead));
            } while (bytesRead == buffer.Length);

            outputs.ForEach(o => o.Close());
        }
    }
}

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:

dir | CopyToFiles files1.txt files2.txt 

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.

Richard
sumber
5
Hmm, unduh tee / cygwin gratis atau beli MSVS dengan uang hasil jerih payah saya untuk program kecil seperti itu? Itu yang sulit :-)
paxdiablo
19
Anda tidak perlu studio visual untuk mengkompilasi itu, alat commandline sebenarnya gratis. cukup google ".net sdk unduh" untuk tautan (tautan langsung tampaknya berubah tetapi google selalu berfungsi).
Kris
13
Visual Studio Express juga gratis, tetapi saya masih menggunakan tee untuk ini.
Brian Rasmussen
7
cygwin sulit dipasang. Terpilih untuk Anda karena ini adalah apa yang saya cari.
Samaursa
1
Saya tidak berpikir ini output ke konsol dan file-file pada saat yang sama bukan?
mjaggard
20

Ini bekerja, meskipun agak jelek:

dir >_ && type _ && type _ > a.txt

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:

ECHO Print line to screen and log to file.  >_ && type _ && type _ >> logfile.txt

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).

MTS
sumber
2
Itu hanya berguna jika Anda ingin menampilkan konten SETELAH proses Anda telah berjalan. Dan itu bukan masalah yang sulit untuk dipecahkan.
Christopher Painter
1
Ya, saya kira ini membahas masalah yang sedikit berbeda dari apa yang diminta poster asli.
MTS
1
+1 Inilah yang selalu saya lakukan. Saya percaya ini adalah jawaban yang benar untuk pertanyaan awal dan harus ditandai demikian. Triknya, seperti yang ditunjukkan oleh @MTS, adalah Anda benar-benar menulis ke dua file: satu yang dibuat per setiap perintah / baris (karenanya satu ">" yang menimpa setiap kali), dan kemudian Anda mengetikkan baris itu ke layar ( ketik ), dan akhirnya, Anda mengetiknya lagi dan mengarahkan outputnya, semua LAMPIRAN, ke file log Anda dengan ">>". Ini adalah bagaimana saya melakukannya selama bertahun-tahun, meskipun saya suka " " file temp sederhana . Saya selalu melakukan "tmp.txt" atau soemthing. Ya, hapus setelah itu.
eduncan911
Ini adalah pendekatan yang bagus tapi saya punya masalah dengan beberapa kesalahan yang tidak ditangkap. Menempatkan typeperintah pada baris terpisah (dalam subrutin) memperbaikinya.
Nate Cook
Apa yang saya butuhkan untuk aplikasi saya.
Alan
16

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:

    someprocess | mtee /+ mylogfile.txt

Di mana / + berarti untuk menambahkan output.

Ini mengasumsikan bahwa Anda telah menyalin mtee ke folder yang ada di PATH, tentu saja.

Menandai
sumber
1
Ini tampaknya menunggu sampai output selesai juga sebelum mengeluarkan ke file atau konsol.
mellamokb
14

Saya ingin sedikit memperluas jawaban Saxon Druce .

Seperti yang dinyatakan, Anda dapat mengarahkan output dari executable di direktori saat ini seperti:

powershell ".\something.exe | tee test.txt"

Namun, ini hanya masuk stdoutke test.txt. Itu juga tidak masuk stderr.

Solusi yang jelas adalah menggunakan sesuatu seperti ini:

powershell ".\something.exe 2>&1 | tee test.txt"

Namun, ini tidak akan berhasil untuk semua something.exe. Beberapa something.exeakan menafsirkan 2>&1sebagai argumen dan gagal. Solusi yang benar adalah alih-alih hanya memiliki tanda kutip di sekitar something.exedan switch dan argumennya, seperti:

powershell ".\something.exe --switch1 --switch2 … arg1 arg2 …" 2>&1 | tee test.txt
ア リ ス タ ー
sumber
Saya mencoba ini ketika membangun pyqt5.7 di windows 10, cukup lamban, output konsol tidak realtime, mungkin buffered? file log terlihat benar
Shuman
3
Semua itu sepenuhnya salah. Itu tidak bekerja sama sekali untuk saya. Perintah terakhir memberi 'tee' is not recognized as an internal or external commandkarena alasan yang jelas. Dengan 2>&1garis cmd di dalam, output apa pun ke stderr menyebabkan kesalahan dari PowerShell.
Pavel P
Bisa menjadi referensi ke cmdlet PowerShell Tee-Object - technet.microsoft.com/en-us/library/ee177014.aspx
Bernd
9

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.

Steve Crane
sumber
Itu masalah tee.bat terlihat bagus. Semoga OP memeriksa ini.
Jay
10
Perhatikan bahwa menggunakan TEE.BAT akan ditampilkan setelah perintah selesai, seperti contoh "dir> a.txt | ketik a.txt" yang diposting di dekatnya.
adzm
8

Jika Anda memiliki cygwin di jalur lingkungan Windows Anda, Anda dapat menggunakan:

 dir > a.txt | tail -f a.txt
jkdba
sumber
7
Jika Anda akan menggunakan Cygwin, ia datang dengan tee.
Tn. Llama
7

dir 1>a.txt 2>&1 | type a.txt

Ini akan membantu mengarahkan ulang STDOUT dan STDERR

rashok
sumber
Ini tidak berhasil. Saya mencoba menggunakan ini untuk meluncurkan run.bat JBoss dan tersedak saat startup dan server membeku. Ada masalah dengan metode ini ...
djangofan
@raja ashok, tidak bekerja untuk saya. Saya telah mencoba python.exe 1> file.txt 2> & 1 | ketik file.txt
neo
4

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.

@if (@CodeSection == @Batch) @then


@echo off
setlocal EnableDelayedExpansion

rem APATee.bat: Asynchronous (real time) Tee program, Batch-JScript hybrid version
rem Antonio Perez Ayala

rem The advantage of this program is that the data management is written in Batch code,
rem so any Batch programmer may modify it to fit their own needs.
rem As an example of this feature, CLS command is correctly managed

if "%~1" equ "" (
   echo Duplicate the Stdout output of a command in the screen and a disk file
   echo/
   echo anyCommand ^| APATee teeFile.txt [/A]
   echo/
   echo If /A switch is given, anyCommand output is *appended* to teeFile.txt
   goto :EOF
)

if "%2" equ ":TeeProcess" goto TeeProcess

rem Get the output of CLS command
for /F %%a in ('cls') do set "cls=%%a"

rem If /A switch is not provided, delete the file that receives Tee output
if /I "%~2" neq "/A" if exist %1 del %1

rem Create the semaphore-signal file and start the asynchronous Tee process
echo X > Flag.out
if exist Flag.in del Flag.in
Cscript //nologo //E:JScript "%~F0" | "%~F0" %1 :TeeProcess
del Flag.out
goto :EOF

:TeeProcess
   rem Wait for "Data Available" signal
   if not exist Flag.in goto TeeProcess
   rem Read the line sent by JScript section
   set line=
   set /P line=
   rem Set "Data Read" acknowledgement
   ren Flag.in Flag.out
   rem Check for the standard "End Of piped File" mark
   if "!line!" equ ":_EOF_:" exit /B
   rem Correctly manage CLS command
   if "!line:~0,1!" equ "!cls!" (
      cls
      set "line=!line:~1!"
   )
   rem Duplicate the line in Stdout and the Tee output file
   echo(!line!
   echo(!line!>> %1
goto TeeProcess


@end


// JScript section

var fso = new ActiveXObject("Scripting.FileSystemObject");
// Process all lines of Stdin
while ( ! WScript.Stdin.AtEndOfStream ) {
   // Read the next line from Stdin
   var line = WScript.Stdin.ReadLine();
   // Wait for "Data Read" acknowledgement
   while ( ! fso.FileExists("Flag.out") ) {
      WScript.Sleep(10);
   }
   // Send the line to Batch section
   WScript.Stdout.WriteLine(line);
   // Set "Data Available" signal
   fso.MoveFile("Flag.out", "Flag.in");
}
// Wait for last "Data Read" acknowledgement
while ( ! fso.FileExists("Flag.out") ) {
      WScript.Sleep(10);
}
// Send the standard "End Of piped File" mark
WScript.Stdout.WriteLine(":_EOF_:");
fso.MoveFile("Flag.out", "Flag.in");
Aacini
sumber
Bagaimana ini bisa menangkap output stderr? Saya memiliki exe yang mengganggu yang menampilkan semua yang ada di aliran kesalahan standar (yaitu untuk menghasilkan file yang biasanya Anda lakukanfile.exe 2>output.txt
Mark Deven
Saya menemukan jawabannya. Anda dapat melakukannya menggunakan file.exe 2>&1|tee.batseperti yang ditemukan di sini: superuser.com/questions/452763/…
Mark Deven
4

Saya juga mencari solusi yang sama, setelah mencoba sedikit, saya berhasil mencapai itu di Command Prompt. Inilah solusi saya:

@Echo off
for /f "Delims=" %%a IN (xyz.bat) do (
%%a > _ && type _ && type _ >> log.txt
)
@Echo on

Ia bahkan menangkap perintah PAUSE apa pun juga.

Koder101
sumber
3

Berikut adalah contoh dari apa yang saya gunakan berdasarkan salah satu jawaban lain

@echo off
REM SOME CODE
set __ERROR_LOG=c:\errors.txt
REM set __IPADDRESS=x.x.x.x

REM Test a variable
if not defined __IPADDRESS (
     REM Call function with some data and terminate
     call :TEE %DATE%,%TIME%,IP ADDRESS IS NOT DEFINED
     goto :EOF
)

REM If test happens to be successful, TEE out a message and end script.
call :TEE Script Ended Successful
goto :EOF


REM THE TEE FUNCTION
:TEE
for /f "tokens=*" %%Z in ("%*") do (
     >  CON ECHO.%%Z
     >> "%__ERROR_LOG%" ECHO.%%Z
     goto :EOF
)
Ed Radke
sumber
3

Sesuatu seperti ini harus melakukan apa yang Anda butuhkan?

%DATE%_%TIME% > c:\a.txt & type c:\a.txt
ipconfig >> c:\a.txt & type c:\a.txt
ping localhost >> c:\a.txt & type c:\a.txt
pause
Richard K
sumber
Hampir, tetapi tidak ditampilkan secara bersamaan - jika Anda memiliki tugas yang berjalan lama, Anda tidak akan mendapatkan hasil untuk waktu yang lama.
JustAMartin
3

kirim output ke konsol, tambahkan ke konsol log, hapus output dari perintah saat ini

dir  >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1
Dennis
sumber
8
mau menjelaskan apa yang terjadi di sini?
John Demetriou 3-15
2

Ini adalah variasi pada jawaban sebelumnya oleh MTS, namun menambahkan beberapa fungsi yang mungkin berguna bagi orang lain. Berikut adalah metode yang saya gunakan:

  • Perintah diatur sebagai variabel, yang dapat digunakan nanti di seluruh kode, untuk output ke jendela perintah dan ditambahkan ke file log, menggunakan set _Temp_Msg_Cmd=
    • perintah telah lolos pengalihan menggunakan ^karakter wortel sehingga perintah tidak dievaluasi pada awalnya
  • File sementara dibuat dengan nama file yang mirip dengan file batch yang sedang dijalankan disebut %~n0_temp.txtyang menggunakan sintaks ekstensi parameter baris perintah %~n0 untuk mendapatkan nama file batch.
  • Output ditambahkan ke file log terpisah %~n0_log.txt

Berikut adalah urutan perintah:

  1. Output dan pesan kesalahan dikirim ke file sementara ^> %~n0_temp.txt 2^>^&1
  2. Isi dari file sementara adalah:
    • ditambahkan ke file log ^& type %~n0_temp.txt ^>^> %~n0_log.txt
    • output ke jendela perintah ^& type %~n0_temp.txt
  3. File sementara dengan pesan dihapus ^& 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%

ClearBlueSky85
sumber
1
@echo on

set startDate=%date%
set startTime=%time%

set /a sth=%startTime:~0,2%
set /a stm=1%startTime:~3,2% - 100
set /a sts=1%startTime:~6,2% - 100


fullprocess.bat > C:\LOGS\%startDate%_%sth%.%stm%.%sts%.LOG | fullprocess.bat

Ini akan membuat file log dengan datetime saat ini dan Anda bisa konsol baris selama proses

7thSphere
sumber
11
Anda tidak memanggil program yang sama dua kali dengan ini?
elcool
1

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.

@echo off
set logfile=test.log

call :ExecuteAndTee dir C:\Program Files

Exit /B 0

:ExecuteAndTee
setlocal enabledelayedexpansion
echo Executing '%*'
  for /f "delims=" %%a in ('%* 2^>^&1') do (echo.%%a & echo.%%a>>%logfile%)
endlocal
Exit /B 0
Cody Barnes
sumber
Saya melakukan hal yang sama ketika mencoba untuk menangkap output dari suatu perintah (IE memasukkannya ke dalam untuk) tetapi kemudian saya hanya memanggil subfungsi standar saya untuk menggema ke layar dan menulis ke log karena saya menggunakannya di seluruh skrip saya untuk mengganti menggunakan gema . Tidak yakin mengapa itu mendapat downvote dari orang lain, jadi saya membatalkannya.
Ben Personick
1

Jika Anda menggunakan CLI, mengapa tidak menggunakan loop FOR untuk "DO" apa pun yang Anda inginkan:

for /F "delims=" %a in ('dir') do @echo %a && echo %a >> output.txt

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.

echo Volume in drive [x] adalah Windows
Volume in drive [x] adalah Windows

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:

for /F "delims=" %a in ('dir 2^>^&1') do @echo %a & echo %a >> output.txt

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.

Harus Bertanya
sumber
1

Sama seperti unix.

dir | tee a.txt

Tidak berfungsi Di windows XP, itu perlu mksntdiinstal.

Ini ditampilkan pada prompt serta menambahkan ke file.

pengguna2346926
sumber
0

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:

ECHO first line on normal stdout. maybe redirected
ECHO second line on normal stdout again. maybe redirected
ECHO third line is to ask the user. not redirected  >CON
ECHO fourth line on normal stdout again. maybe redirected

Lihat juga deskripsi pengalihan yang baik: http://www.p-dd.com/chapter7-page14.html


sumber
0

Bagaimana cara menampilkan dan mengarahkan output ke file. Misalkan jika saya menggunakan perintah dos, dir> test.txt, perintah ini akan mengarahkan output ke file test.txt tanpa menampilkan hasilnya. cara menulis perintah untuk menampilkan output dan mengarahkan output ke file menggunakan DOS yaitu, command prompt windows, bukan di UNIX / LINUX.

Anda dapat menemukan perintah-perintah ini dalam biterscripting ( http://www.biterscripting.com ) bermanfaat.

var str output
lf > $output
echo $output                            # Will show output on screen.
echo $output > "test.txt"               # Will write output to file test.txt.
system start "test.txt"                 # Will open file test.txt for viewing/editing.
SORE
sumber
0

Ini bekerja secara real time tetapi juga agak jelek dan kinerjanya lambat. Tidak diuji dengan baik:

@echo off
cls
SET MYCOMMAND=dir /B
ECHO File called 'test.bat' > out.txt
for /f "usebackq delims=" %%I in (`%MYCOMMAND%`) do (
  ECHO %%I
  ECHO %%I >> out.txt
) 
pause
Djangofan
sumber
6
Tidak, ini bukan waktu nyata, menunggu sampai %MYCOMMAND%selesai dan gagal dalam banyak kasus. Itu melompat baris kosong, baris yang dimulai dengan ;gagal dengan konten seperti <space>/<TAB>, ON, OFFatau /?. Tetapi sisanya kadang-kadang bisa bekerja :-)
jeb
0

Alternatifnya adalah tee stdout ke stderr dalam program Anda:

di java:

System.setOut(new PrintStream(new TeeOutputStream(System.out, System.err)));

Kemudian, dalam dos batchfile Anda: java program > log.txt

Stdout akan menuju ke file log dan stderr (data yang sama) akan ditampilkan di konsol.

Koordinator
sumber
0

Saya menginstal perl pada sebagian besar mesin saya jadi jawaban menggunakan perl: tee.pl

my $file = shift || "tee.dat";
open $output, ">", $file or die "unable to open $file as output: $!";
while(<STDIN>)
{
    print $_;
    print $output $_;
}
close $output;

dir | perl tee.pl atau dir | perl tee.pl dir.bat

kasar dan belum teruji.

DannyK
sumber
0

Variasi lain adalah dengan membagi pipa, dan kemudian mengarahkan kembali output yang Anda inginkan.

    @echo off
    for /f "tokens=1,* delims=:" %%P in ('findstr /n "^"') do (
      echo(%%Q
      echo(%%Q>&3
    )
    @exit/b %errorlevel%

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 ...

    dir | splitPipe.bat  1>con  2>&1  3>my_stdout.log

    splitPipe.bat 2>nul < somefile.txt
pengguna3726414
sumber
-1
  1. https://cygwin.com/install
  2. Klik tautan untuk "setup-x86_.exe"
  3. Jalankan penginstal
  4. Pada ~ halaman ke-2, pilih "mirror" untuk mengunduh (saya mencari domain .edu)
  5. Saya bilang ok untuk opsi standar
  6. Cygwin cepat selesai menginstal
  7. Buka cmd
  8. Ketik c:\cygwin64\bin\script.exedan masukkan
  9. Ketik cmddan masukkan
  10. Jalankan program Anda
  11. Ketik exitdan masukkan (keluar dari cmd.exe Cygwin)
  12. Ketik exitdan masukkan (keluar dari script.exe Cygwin)
  13. Lihat output layar program Anda dalam file teks yang disebut "naskah"
Joseph Hansen
sumber