Windows komut istemi çıktısını görüntüleme ve bir dosyaya yeniden yönlendirme


371

Windows komut isteminde bir komut satırı uygulamasını nasıl çalıştırabilirim ve çıktıyı aynı anda hem görüntülenebilir hem de bir dosyaya yeniden yönlendirebilirim?

Örneğin, komutu çalıştıracak olsaydım, dir > test.txtçıktı test.txtsonuçları görüntülenmeden çağrılan bir dosyaya yönlendirilirdi .

Nasıl bir komut çıktısını görüntülemek için yazabilirim ve benzer istemi, Windows komut bir dosyaya yönlendirme çıktı, teeUnix üzerinde komuta?


63
Ve lütfen MSDOS demeyi kes! Cmd.exe ile bu braindead command.com arasındaki benzerlikler çok küçüktür ve küçülür.
paxdiablo


Bunlardan hiçbiri bir metin çıktısı bir dll yükleyen bir konsol uygulaması varsa çalışır. Ana uygulama metni bir dosyaya yönlendirilir, ancak dll çıktısı konsol penceresinde görüntülenmez ve görüntülenmeye devam eder. Ben dll metni yakalamak için hiçbir yol bulmadım.
Brian Reinhold

1
biri hâlâ bir dosyaya
geçebilir

Bir komut satırı yardımcı programı kullanıyorum ve çıktıyı ekranda görüntülenenle aynı biçimde bir dosyaya yeniden yönlendirmek istiyorsanız, bağlantıları ayıklamak için youtube-dl kullandım ve çıktıyı bir txt dosyasına yeniden yönlendirebilirdim, ancak komut isteminde, dosyada tek satır olarak geliyor.
beastboy

Yanıtlar:


153

Davor'un cevabını genişletmek için PowerShell'i şu şekilde kullanabilirsiniz:

powershell "dir | tee test.txt"

Geçerli dizinde bir exe çıktısını yeniden yönlendirmeye çalışıyorsanız .\, dosya adında kullanmanız gerekir , örneğin:

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

8
Bu en yakın cevaptır: PS zaten çoğu makinede ve özellikle sunucularda olduğu için varsayılan kurulumda çalışır.
Stoleg

1
Bu en iyi cevap! Basit ve "kutunun dışında" çalışıyor
Josh Werts

3
GİBİ :) neyse {powershell "ping -n 10 localhost | tee test.txt"} tee partisinde neler olduğunu daha iyi gösterecekti
grenix

4
dirpowershell'de cmd'nin Get-ChildItemdahili dirkomutu gibi olmayan bir takma ad olduğunu unutmayın . Eğer powershell "cmd /c dir | tee test.txt"cmd dahili sürümünü istiyorsanız gerekir
phuclv

8
tüm çıktıları görmek için STDERR'ı STDOUT'a yönlendirmeyi unutmayın 2>&1, örneğinnode 2>&1 | tee debug_log.txt
Zhe Hu

132

Çıktıyı bir dosyaya ve sonra konsola yeniden yönlendirmenin bir çözümünü / geçici çözümünü buldum :

dir > a.txt | type a.txt

Burada dir , çıktının yeniden yönlendirilmesi gereken komuttur , a.txt çıktısının saklanacağı bir dosyadır.


100
Bu, yanıtı tatmin eder, ancak veri üretilmektense dir komutu tamamlandıktan sonra verileri verir.
Leigh Riffel

10
çalışır, ancak komut stdin'den bir girdi beklerse sıkışırsınız.
Vitim.us

5
Bu basit cevabı seviyorum! A &yerine bir |komutun çıktısı için gerekli olduğunu buldum, pingveya gibi7z.exe
Wes Larson

Bunun yerine etkileşimli komutlar için çalışmıyor dir. Örnek: chkdsk /f c: > c:\Temp.txt | c:\Temp.txt. Sistem rapor dosyası başka bir işlem tarafından kilitlendi.
Sopalajo de Arrierez

4
@lii re: handle output to stderr- 2>&1Yönlendirmeyi şu şekilde ekleyin : dir 2>&1 > a.txt & type a.txtve stderr'ın stdout ile karıştırılması gerekir .
Jesse Chisholm

97

Unix teekomutunun tam olarak bunu yapan bir Win32 portu var. Bkz. Http://unxutils.sourceforge.net/ veya http://getgnuwin32.sourceforge.net/


17
Bağlantı, Unix komut tee'sinin bir Windows uygulamasını gösterir, böylece Windows üzerinde çalışır.
Brian Rasmussen

3
Evet, cevabı ve yorumu oylayın. Aslında her şeye sahip olduğundan CygWin'i tercih ederim ama bazı insanlar seçip seçebilecekleri DLL olmayan araçları tercih ediyorlar.
paxdiablo

3
Birçok Unix yardımcı programı da GnuWin32 projesi tarafından taşınmaktadır, bkz. Gnuwin32.sourceforge.net .
VladV

2
UnxUtils en son 2003 yılında güncellendi; GnuWin32 biraz daha güncel.
quack quixote

9
Benim gibi GnuWin32'nin teepaketini bulmak için mücadele ederseniz , gnuwin32.sourceforge.net/packages/coreutils.htm'de bulabilirsiniz .
Nigel Touch

49

Şuna bir göz at: wintee

Cygwin'e gerek yok.

Yine de bazı sorunlarla karşılaştım ve rapor ettim.

Ayrıca , tee (ve cygwin için gerek yok) içerdiği için unxutils'i kontrol edebilirsiniz , ancak çıktı EOL'lerinin burada UNIX benzeri olduğuna dikkat edin.

Son olarak, PowerShell'iniz varsa Tee-Object'i deneyebilirsiniz. Tip get-help tee-objectfazla bilgi için PowerShell konsolunda.


4
Neden aşağı oy? Buradaki yanıtların% 95'inin ortak bir yanı vardır: çıktı yalnızca ilk komut bittikten sonra yeniden yönlendirilir: yorumları okuyun. UNIX yardımcı programı teegerçek zamanlı çıktı sağlar. wteeaynı işlevselliğe sahiptir. Eğer hata sakıncası yoksa, gayet iyi olacak.
Davor Josipovic

Powershell> 4.0'a sahip olmayan benim için çalışan tek çözüm bu. Başparmak havaya!
Alex

46

@ tori3852

onu buldum

dir > a.txt | type a.txt

işe yaramadı (sadece ilk birkaç dir listeleme satırı - işlem çatallama ve ikinci bölüm, korkunç liste tamamlanmadan önce sona erdi 'türü' komut şüpheli?), bunun yerine kullandım:

dir > z.txt && type z.txt

sıralı komutlar, ikinci başlamadan önce tamamlanır.


17
Komut başarısız olsa bile komutun yürütülmesini sağlamak istiyorsanız &yerine kullanmalısınız . Bu, komutunuzda bir tür hata olduğunda ve yine de günlük dosyasını konsolda görmek istediğinizde kullanışlıdır. Microsoft'un bu konudaki makalesine bakın . Ancak, bunun hata düzeyine (0 olur) ayarlanması sorunu vardır . &&typedir%errorlevel%type
ADTC

25

Ne yazık ki böyle bir şey yok.

Windows konsol uygulamalarının yalnızca tek bir çıktı tutamacı vardır. (Eh, iki tane var STDOUT, STDERRama burada önemli değil)> Konsol tutamacına normal olarak yazılan çıktıyı bir dosya tutamacına yönlendirir.

Bir çeşit çoğullamaya sahip olmak istiyorsanız, çıktıyı yönlendirebileceğiniz harici bir uygulama kullanmanız gerekir. Bu uygulama daha sonra bir dosyaya ve konsola tekrar yazabilir.


3
teeon * nix ayrıca ayrı bir uygulamadır, kabukta bazı yönlendirmeler değil
phuclv

22

Basit bir C # konsol uygulaması hile yapar:

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());
        }
    }
}

Bunu kullanmak için, kaynak komutunu programa bağlar ve çıktıyı çoğaltmak istediğiniz dosyaların yolunu sağlarsınız. Örneğin:

dir | CopyToFiles files1.txt files2.txt 

Dir sonuçlarını gösterecek ve sonuçları hem file1.txt hem de files2.txt dosyalarında depolayacaktır.

Yukarıda hata işleme yolunda çok fazla (hiçbir şey!) Olmadığını ve birden fazla dosyayı desteklemenin gerçekten gerekli olmayabileceğini unutmayın.


5
Hmm, tee / cygwin'i hiçbir şey için indirmeyin veya böyle küçük bir program için zor kazanılmış paramla MSVS satın alıyor musunuz? Bu zor bir :-)
paxdiablo

19
Bunu derlemek için görsel stüdyoya ihtiyacınız yok, komut satırı araçları aslında ücretsiz. bağlantı için sadece google ".net sdk indir" (doğrudan bağlantı değişiyor gibi görünüyor ama google her zaman çalışıyor gibi görünüyor).
Kris

13
Visual Studio Express de ücretsizdir, ancak yine de bunun için tee kullanırdım.
Brian Rasmussen

7
cygwin kurulumu bir acıdır. Sana oy verin çünkü aradığım şey buydu.
Samaursa

1
Bu konsol ve dosyaları aynı anda çıktı sanmıyorum?
mjaggard

20

Bu biraz çirkin olmasına rağmen çalışır:

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

Diğer çözümlerden biraz daha esnektir, ifadeyle çalışır, böylece eklemek için de kullanabilirsiniz. Mesajları günlüğe kaydetmek ve görüntülemek için toplu iş dosyalarında biraz kullanıyorum:

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

Evet, sadece ECHO deyimini tekrarlayabilirsiniz (bir kez ekran ve ikinci kez günlük dosyasına yönlendiriliyor), ancak bu kadar kötü görünüyor ve bir bakım sorunu. En azından bu şekilde iki yerde mesajlarda değişiklik yapmanız gerekmez.

_ Dosyasının sadece kısa bir dosya adı olduğuna dikkat edin, bu nedenle toplu iş dosyanızın sonunda (bir toplu iş dosyası kullanıyorsanız) bu dosyayı sildiğinizden emin olmanız gerekir.


2
Bu, yalnızca işleminiz çalıştıktan SONRA içeriği görüntülemek istiyorsanız kullanışlıdır. Ve bu çözülmesi zor bir sorun değil.
Christopher Painter

1
Evet, sanırım bu orijinal posterin sorduğundan biraz farklı bir soruna işaret ediyor.
MTS

1
+1 Her zaman böyle yaptım. Bunun asıl sorunun doğru cevabı olduğuna ve böyle işaretlenmesi gerektiğine inanıyorum. @MTS'nin ima ettiği gibi, hile aslında iki dosyaya yazmanızdır: her komut / satır başına oluşturulan bir dosya (bu nedenle her seferinde üzerine yazan tek bir ">") ve ardından bu satırı ekrana yazarsınız ( yazın ) ve son olarak, yeniden yazın ve tüm uzun EKLEME çıktısını ">>" ile günlük dosyanıza yönlendirirsiniz. Ben basit " " geçici dosyayı seviyorum rağmen, yıllardır böyle yaptım . Her zaman "tmp.txt" ya da soemthing yaptım. Evet, daha sonra silin.
eduncan911

Bu iyi bir yaklaşım ama yakalanamayan bazı hatalarla ilgili sorunlar yaşadım. typeKomutları ayrı satırlara koymak (altyordamda) bunu düzeltti.
Nate Cook

Uygulamam için tam ihtiyacım olan şey.
Alan

16

mtee bu amaç için çok iyi çalışan küçük bir yardımcı programdır. Ücretsiz, kaynak açık ve Just Works.

Http://www.commandline.co.uk adresinde bulabilirsiniz .

Bir toplu iş dosyasında çıktıyı görüntülemek ve aynı anda bir günlük dosyası oluşturmak için kullanılır, sözdizimi şöyle görünür:

    someprocess | mtee /+ mylogfile.txt

Nerede / + çıktı eklemek anlamına gelir.

Bu, mtee'yi elbette PATH'de bulunan bir klasöre kopyaladığınızı varsayar.


1
Bu, dosyaya veya konsola çıkış yapmadan önce çıkışın tamamlanmasını bekler.
mellamokb

14

Saxon Druce'un mükemmel cevabını biraz genişletmek istiyorum .

Belirtildiği gibi, geçerli dizindeki bir yürütülebilir dosyanın çıktısını şu şekilde yeniden yönlendirebilirsiniz:

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

Ancak, bu yalnızca oturum stdoutaçar test.txt. Ayrıca günlüğe kaydetmez stderr.

Açık çözüm şöyle bir şey kullanmak olacaktır:

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

Ancak, bu tüm something.exes için işe yaramaz . Bazıları bir argüman olarak something.exeyorumlayacak 2>&1ve başarısız olacaktır. Doğru çözüm, bunun yerine something.exe, anahtarları ve bağımsız değişkenleri etrafında yalnızca kesme işaretlerine sahip olmaktır :

powershell ".\something.exe --switch1 --switch2 … arg1 arg2 …" 2>&1 | tee test.txt

Windows 10'da pyqt5.7 oluştururken bunu denedim, oldukça halsiz, konsol çıkışı gerçek zamanlı değil, belki tamponlu? günlük dosyası doğru görünüyor
Shuman

3
Bütün bunlar tamamen yanlış. Benim için hiç işe yaramıyor. Son komut 'tee' is not recognized as an internal or external commandbariz sebepler verir . İle 2>&1iç cmd hattına stderr'e herhangi çıktı powershell gelen hatalara neden olur.
Pavel P

PowerShell Tee-Object cmdlet'ine bir referans olabilir - technet.microsoft.com/en-us/library/ee177014.aspx
Bernd

9

Brian Rasmussen ile aynı fikirdeyim, bu bağlantı noktası bunu yapmanın en kolay yoludur. Gelen Toplu Dosyalar onun bölümüne Scripting Sayfalar Woude der Rob van kullanım MS-DOS ve CMD komutları hakkında bilgi hazinesi sağlar. Ben senin sorunun için yerel bir çözüm olabilir ve orada kazma sonra tee MS-DOS toplu dil uygulaması sadece gibi görünüyor TEE.BAT bulundu düşündüm . Oldukça karmaşık görünen bir toplu iş dosyası ve eğimim hala unxutils portunu kullanmak olacak.


Bu tee.bat şey güzel görünüyor. Umut OP bunu kontrol eder.
Jay

10
Komut tamamlandıktan sonra, tıpkı yakınlarda yayınlanan "dir> a.txt | type a.txt" örneği gibi TEE.BAT kullanıldığında çıktı alınacağını unutmayın.
adzm

8

Windows ortam yolunuzda cygwin varsa kullanabilirsiniz:

 dir > a.txt | tail -f a.txt

7
Cygwin kullanacaksanız, tişörtle birlikte gelir.
Bay Llama

7

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

Bu, hem STDOUT'u hem de STDERR'ı yönlendirmeye yardımcı olacaktır


Bu işe yaramıyor. JBoss run.bat başlatmak için bunu denedim ve başlatma sırasında boğulur ve sunucu donar. Bu yöntemle ilgili sorunlar var ...
djangofan

@raja ashok, benim için çalışmıyor. Ben python.exe 1
neo

4

Bunun çok eski bir konu olduğunu biliyorum, ancak önceki cevaplarda Batch'ta yazılmış bir gerçek zamanlı Tee'nin tam bir uygulaması yok. Aşağıdaki çözümüm, yalnızca borulu komuttan çıktı almak için JScript bölümünü kullanan bir Batch-JScript karma komut dosyasıdır, ancak verilerin işlenmesi Batch bölümünde yapılır. Bu yaklaşım, herhangi bir Batch programcının bu programı belirli ihtiyaçlara uyacak şekilde değiştirebilmesi avantajına sahiptir. Bu program ayrıca diğer Batch dosyaları tarafından üretilen CLS komutunun çıkışını doğru bir şekilde işler, yani CLS komut çıkışı algılandığında ekranı temizler.

@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");

Stderr çıktısını yakalamanın herhangi bir yolu var mı? Ben standart hata akışı her şeyi çıktılar sinir bozucu bir exe var (yani normalde yapacağınız bir dosyaya çıktı içinfile.exe 2>output.txt
Mark Deven

Bunu anladım. file.exe 2>&1|tee.batBurada bulunan şekliyle bunu yapabilirsiniz : superuser.com/questions/452763/…
Mark Deven

4

Aynı çözümü de arıyordum, biraz denedikten sonra Komut İstemi'nde bunu başarıyla başardım. İşte benim çözümüm:

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

Hatta herhangi bir PAUSE komutunu bile yakalar.


3

İşte diğer cevaplardan birine dayanarak kullandığımın bir örneği

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

3

Böyle bir şey ihtiyacınız olanı yapmalı mı?

%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

Neredeyse, ancak aynı anda görüntülenmiyor - uzun süren bir göreviniz varsa, uzun süre sonuç alamazsınız.
JustAMartin

3

konsola çıktı gönder, konsol günlüğüne ekle, geçerli komuttan çıktıyı sil

dir  >> usb-create.1 && type usb-create.1 >> usb-create.log | type usb-create.1 && del usb-create.1

8
burada neler olduğunu açıklamak ister misiniz?
John Demetriou

2

Bu, MTS'nin önceki bir cevabındaki bir varyasyondur , ancak başkalarına faydalı olabilecek bazı işlevler ekler. İşte kullandığım yöntem:

  • Komut, komut penceresine çıktı vermek ve bir günlük dosyasına eklemek için kod boyunca daha sonra kullanılabilecek bir değişken olarak ayarlanır. set _Temp_Msg_Cmd=
    • komut, havuç karakteri kullanılarak yeniden yönlendirmeden kaçtı , ^böylece komutlar başlangıçta değerlendirilmeyecek
  • Toplu iş dosyasının adını almak için komut satırı parametre uzantısı sözdizimini%~n0_temp.txt kullanan çalıştırılan toplu iş dosyasına benzer bir dosya adı ile geçici bir dosya oluşturulur . %~n0
  • Çıktı ayrı bir günlük dosyasına eklenir %~n0_log.txt

İşte komutların sırası:

  1. Çıktı ve hata mesajları geçici dosyaya gönderilir ^> %~n0_temp.txt 2^>^&1
  2. Geçici dosyanın içeriği her ikisidir:
    • günlük dosyasına eklenmiş ^& type %~n0_temp.txt ^>^> %~n0_log.txt
    • komut penceresine çıktı ^& type %~n0_temp.txt
  3. İletinin bulunduğu geçici dosya silinir ^& del /Q /F %~n0_temp.txt

İşte örnek:

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

Bu şekilde komut daha sonra çok daha temiz görünen bir toplu iş dosyasındaki daha sonraki komutlardan sonra eklenebilir:

echo test message %_Temp_Msg_Cmd%

Bu, diğer komutların sonuna da eklenebilir. Mesajların birden fazla satırı olduğunda çalışacağını söyleyebildiğim kadarıyla. Örneğin, bir hata mesajı varsa aşağıdaki komut iki satır verir:

net use M: /D /Y %_Temp_Msg_Cmd%


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

Bu, geçerli datetime ile bir günlük dosyası oluşturur ve işlem sırasında konsol satırlarını


11
bununla aynı programı iki kez çağırmıyor musunuz?
elcool

1

Bir kerede bir satır çıktı almak ve her ikisi de bu satırı bir dosyaya yazmak ve konsola çıktı almak için "for" deyimi ile bir toplu alt yordam kullanın.

@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

Bir komut (IE bir for içine koymak) çıktı yakalamaya çalışırken aynı şeyi yapıyorum ama sonra sadece echo ekran yerine benim senaryo boyunca kullanmak için ekrana yankı ve günlüğe yazmak için benim standart alt işlev çağırmak . Bunun neden diğerlerinden bir aşağı oy aldığından emin değilim, bu yüzden onu iptal ettim.
Ben Personick

1

CLI kullanıyorsanız, neden "DO" yapmak için bir FOR döngüsü kullanmıyorsunuz:

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

Döngüler için Windows CMD'de harika kaynak: https://ss64.com/nt/for_cmd.html Buradaki anahtar, her çıkış hattını parçalayacak sınırlayıcıları (sınırlamaları) hiçbir şeye ayarlamamaktır. Bu şekilde varsayılan beyaz boşluktan etkilenmez. % A isteğe bağlı bir harftir, ancak "do" bölümünde her satırda ayrıştırılan karakterlerle bir şeyler yapmak için kullanılır. Bu durumda, seçtiğimiz bir dosyaya oluşturmak veya eklemek (>>) için 2. yankı komutunu çalıştırmak için ve işaretlerini (&&) kullanabiliriz. Dosyanın yazılmasında bir sorun olması durumunda bu DO komutlarının sırasını korumak daha güvenlidir, en azından ilk önce konsola yankıyı alırız. İlk yankının önündeki at işareti (@), konsolun echo komutunun kendisini göstermesini engeller ve bunun yerine yalnızca% a karakterlerini görüntüleyen komutun sonucunu görüntüler. Aksi takdirde şunu görürsünüz:

echo [x]
sürücüsündeki birim Windows [x] sürücüsündeki birim Windows

GÜNCELLEME: / F, boş satırları atlar ve yalnızca düzeltme, her satıra bir karakter ekleyerek çıktıyı önceden filtrelemektir (belki find komutuyla satır numaraları ile). Bunu CLI'de çözmek hızlı veya hoş değil. Ayrıca, STDERR'ı dahil etmedim, bu yüzden burada da hataları yakalama:

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

Hata Mesajlarını Yeniden Yönlendirme

İşaretler (^) arkalarından sembollerden kaçmak için oradadır, çünkü komut, aksine komut satırına doğrudan girilen yorumlanan bir dizedir.


1

Tıpkı unix gibi.

dir | tee a.txt

Windows XP'de mksntyüklü olması gerekir .

Bilgi isteminde görüntülenir ve dosyaya eklenir.


0

Aşağıda, toplu iş dosyası bir dosyaya yönlendirilse bile ekranda gerçekten bir şey görmek istiyorsanız yardımcı olur. CON cihazı bir dosyaya yönlendirilirse de kullanılabilir

Misal:

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

Ayrıca iyi yönlendirme açıklamasına bakın: http://www.p-dd.com/chapter7-page14.html


0

Çıkışı bir dosyaya nasıl görüntüler ve yönlendiririm. Dos komutu, dir> test.txt kullanırsam, bu komutun sonuçları görüntülemeden test.txt dosyasına yönlendireceğini varsayalım. çıktıyı görüntülemek ve çıktıyı DOS kullanarak bir dosyaya yeniden yönlendirmek için bir komut nasıl yazılır, yani UNIX / LINUX'da değil, windows komut istemi.

Bu komutları biterscripting'de ( http://www.biterscripting.com ) yararlı bulabilirsiniz.

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.

0

Bu gerçek zamanlı olarak çalışır, ancak aynı zamanda çirkin ve performans yavaştır. İyi test edilmedi:

@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

6
Hayır, gerçek zamanlı değil, bitene kadar bekler %MYCOMMAND%ve birçok durumda başarısız olur. Bu çizgiler ile başlayan boş satırları atlar ;gibi içerikle başarısız <space>/<TAB>, ON, OFFveya /?. Ama gerisi bazen işe yarayabilir :-)
jeb

0

Alternatif olarak, stdout'u programınızdaki stderr'a yönlendirebilirsiniz:

java:

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

Ardından, dos toplu dosyanızda: java program > log.txt

Stdout günlük dosyasına gider ve stderr (aynı veri) konsolda gösterilir.


0

Perl'i çoğu makineme yüklüyorum, bu yüzden perl: tee.pl kullanarak bir cevap

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 veya dir | perl tee.pl Instagram Hesabındaki Resim ve Videoları dir.bat

kaba ve denenmemiş.


0

Başka bir varyasyon, boruyu bölmek ve ardından çıkışı istediğiniz gibi yeniden yönlendirmektir.

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

Yukarıdakileri bir .bat dosyasına kaydedin. Filestream 1'deki metin çıkışını da filestream 3'e böler, bu da gerektiğinde yeniden yönlendirebilirsiniz. Aşağıdaki örneklerde, yukarıdaki script splitPipe.bat çağırdı ...

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

    splitPipe.bat 2>nul < somefile.txt

-1
  1. https://cygwin.com/install
  2. "Setup-x86_.exe" bağlantısını tıklayın.
  3. Yükleyiciyi çalıştırın
  4. ~ 2. sayfada, indirmek için bir "ayna" seçin (Bir .edu alan adı aradım)
  5. Standart seçeneklere tamam dedim
  6. Cygwin hızlı bir şekilde kurulumu tamamladı
  7. Açık cmd
  8. tip c:\cygwin64\bin\script.exe ve girin
  9. tip cmd ve girin
  10. Programınızı çalıştırın
  11. tip exit ve girin (Cygwin's cmd.exe dosyasından çıkar)
  12. Yazın exitve girin (Cygwin's script.exe dosyasından çıkar)
  13. "Typescript" adlı metin dosyasında programınızın ekran çıktısına bakın
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.