Çıktıyı Toplu İş Dosyasından Yeniden Yönlendirme


110

Bir sistemden bilgi toplamak için bazı basit komutlarla bir toplu iş dosyası oluşturuyorum. Toplu iş dosyası, zamanı, IP bilgilerini, kullanıcıları vb. Almak için komutlar içerir.

Tüm komutları bir toplu iş dosyasında topladım ve çalışıyor, ancak sonuçları bir metin dosyasına (günlük) yazdırmak için çalıştırıldığında toplu iş dosyasını istiyorum. Toplu işleme ekleyebileceğim bir komut var mı?

Toplu işi cmd'den çalıştırmak ve ardından çıktıyı yeniden yönlendirmek istemediğimi unutmayın; Mümkünse, çıktıyı toplu işin içinden yeniden yönlendirmek istiyorum.

Yanıtlar:


161

Dosya işaretçisini birçok kez açıp Dosya Sonuna konumlandırdığı için yavaş olan basit saf yol.

@echo off
command1 >output.txt
command2 >>output.txt
...
commandN >>output.txt

Daha iyi bir yol - yazması daha kolay ve daha hızlı çünkü dosya yalnızca bir kez açılıp konumlandırıldı.

@echo off
>output.txt (
  command1
  command2
  ...
  commandN
)

Dosyayı yalnızca bir kez açan ve konumlandıran başka bir iyi ve hızlı yol

@echo off
call :sub >output.txt
exit /b

:sub
command1
command2
...
commandN

Düzenle 2020-04-17

Arada sırada iki veya daha fazla dosyaya tekrar tekrar yazmak isteyebilirsiniz. Ekranda farklı mesajlar da isteyebilirsiniz. Bunu, parantezli bir blok veya alt yordamın dışındaki tanımsız tutamaçlara yeniden yönlendirerek ve ardından &gösterimi zaten açılmış dosyalara başvurmak için kullanarak verimli bir şekilde yapmak hala mümkündür .

call :sub 9>File1.txt 8>File2.txt
exit /b

:sub
echo Screen message 1
>&9 File 1 message 1
>&8 File 2 message 1
echo Screen message 2
>&9 File 1 message 2
>&8 File 2 message 2
exit /b

9 ve 8 numaralı kolları ters sırada kullanmayı seçtim çünkü bu şekilde, aynı komutta birden çok yeniden yönlendirme gerçekleştirirken bir Microsoft yeniden yönlendirme uygulama tasarım hatası nedeniyle olası kalıcı yeniden yönlendirmeyi önleme olasılığı daha yüksektir . Bu pek olası değildir, ancak yeterince uğraşırsanız bu yaklaşım bile hatayı ortaya çıkarabilir. Yönlendirmeyi hazırlarsanız, sorundan kaçınmanız garanti edilir.

3>File1.txt ( 4>File2.txt call :sub)
exit /b

:sub
etc.

2
Dosyanın geri kalanı için ayarlayabileceğim çözümleri seviyorum
Sam

3
Not çağrı çözümü değiştirir % 0 (hiç alt veya istediğiniz gibi olmayabilir olabilen bu durumda).
Jannes

2
@Jannes - Doğru, ancak bir değiştirici eklerseniz her zaman çalışan toplu komut dosyası hakkında bilgi alabilirsiniz. Örneğin, %~f0bir CALLed: alt yordamının içindeyken bile her zaman toplu komut dosyasının tam yolunu verir.
dbenham

3
@ThariqNugrohotomo ->output.txt 2>&1
dbenham

2
@Moondra - aynı komut dosyası içinde etiketli bir alt yordamı çağırmak için standart toplu sözdizimidir. Yürütme cmd /?veya help cmdbelgeler için konsol komut satırından. Üçüncü yöntemin püf noktası, CALL'daki yeniden yönlendirmenin CALLed alt yordamı içindeki tüm komutlar için geçerli olmasıdır.
dbenham


16

Bunun daha eski bir gönderi olduğunu biliyorum, ancak birisi bir Google aramasında bununla karşılaşacak ve aynı zamanda OP'nin yorumlarda sorduğu bazı sorulara özel olarak değinilmemiş gibi görünüyor. Ayrıca, SO'da yayınlanan ilk cevabım olduğu için lütfen bana karşı dikkatli olun. :)

Çıktıyı dinamik olarak oluşturulmuş bir dosya adı kullanarak bir dosyaya yeniden yönlendirmek için, go-to (oku: hızlı ve kirli) yaklaşımım @dbenham tarafından sunulan ikinci çözümdür. Örneğin, bu:

@echo off
> filename_prefix-%DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log (
echo Your Name Here
echo Beginning Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
REM do some stuff here
echo Your Name Here
echo Ending Date/Time: %DATE:~-4%-%DATE:~4,2%-%DATE:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%.log
)

Hedef dizindeki dosyanın bu ekran görüntüsünde gördüğünüz gibi bir dosya oluşturacak

Bu çıktıyı içerecek:

Your Name Here
Beginning Date/Time: 2016-09-16_141048.log
Your Name Here
Ending Date/Time: 2016-09-16_141048.log

Ayrıca, bu çözümün yerel ayara bağlı olduğunu unutmayın, bu yüzden onu nasıl / ne zaman kullandığınıza dikkat edin.


Teşekkürler, bu faydalı oldu. Kısa soru, .log ve .txt kullanmanızın bir nedeni var mı? Bu bir fark yaratır mı?
Moondra

1
@Moondra hayır öyle değil. Bu durumda sadece anlambilim. Bu, dosya türüne göre / grep gerektiren uygulamalar olmadığı anlamına gelmez, bu nedenle dosyalarınızın kullanılıp kullanılmadığını / nasıl kullanıldığına dikkat edin.
Anthony

9
echo some output >"your logfile"

veya

(
 echo some output
 echo more output
)>"Your logfile"

faturayı doldurmalısınız.

APPENDÇıktı almak istiyorsanız , >>yerine kullanın >. >yeni bir günlük dosyası başlatacak.


9
@echo off
>output.txt (
echo Checking your system infor, Please wating...

systeminfo | findstr /c:"Host Name" 
systeminfo | findstr /c:"Domain"

ipconfig /all | find "Physical Address" 

ipconfig | find "IPv4" 
ipconfig | find "Default Gateway"

)

@pause

Bence bu en zarif yol. Teşekkürler Wesley!
Kiswanij

5

Çıkışı bir dosyaya ve konsola yönlendirmek için kullanabileceğiniz harika bir küçük program var.

some_command  ^|  TEE.BAT  [ -a ]  filename 


4

Bu iki satırı toplu iş dosyanızın üstüne yakın bir yere ekleyin, tüm stdout ve stderr log.txt dosyasına yönlendirilecektir:

if not "%1"=="STDOUT_TO_FILE"  %0 STDOUT_TO_FILE %*  >log.txt 2>&1
shift /1

Bu benim için çalıştı, teşekkürler. Bunun başarısız olabileceği özel hususlar var mı? (örn. çıktı boyutu aşımı)
CCarlos

Merhaba, Cevabınız için teşekkürler! konsolda da yönlendirmenin bir yolu var mı?
Sandeep Singh

3
@echo OFF
[your command] >> [Your log file name].txt

Yukarıdaki komutu toplu iş dosyamda kullandım ve çalışıyor. Günlük dosyasında komutumun sonuçlarını gösteriyor.


0

Girişte "toksik" karakterler olması durumunda bu başarısız olabilir. Bunun gibi bir girdi düşünmek, neler olup bittiğini anlamanın iyi bir yoludur. Elbette, bir girdi dizesinin çift tırnak içinde olması ZORUNLU olduğu bir kural vardır, ancak bu kuralın yalnızca girdinin anlamı bir NTFS bölümündeki bir konumsa geçerli bir kural olduğunu hissediyorum (belki de URL'ler için bir kuraldır. emin değilim). Ama tabii ki bu rastgele bir girdi dizisi için bir kural değildir (bu "iyi bir uygulamadır" ama onunla sayamazsınız).


0

Toplu iş dosyanızın altına aşağıdaki satırları eklemek, her şeyi CMD penceresinde görüntülendiği gibi alır ve bir metin dosyasına aktarır:

powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^a')
powershell -c "$wshell = New-Object -ComObject wscript.shell; $wshell.SendKeys('^c')
powershell Get-Clipboard > MyLog.txt

Temelde tümünü seç -> panoya kopyala -> metin dosyasına yapıştırır .

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.