PowerShell ve Tee


10

Çıktıyı hem konsolda hem de bir dosyada görmek için bu komutu kullanıyorum:

powershell -command "my_command_1 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"  
powershell -command "my_command_2 | tee ('logs\{0}.log' -f (Get-Date -format 'yyyy.MM.dd-HH.mm'))"
# etc

Beklediğim kadar iyi çalışmıyor ve bazı sorularım var:

  1. Stderr'ı bir dosyaya nasıl yeniden yönlendirebilirim?
  2. Çıktı çok garip çalışıyor. Bazı komutlar için metin yazdırılır ve konsol / dosya güncellenir. Diğer bazı komutlar için metin yazdırıldığında çıktı güncellenmiş gibi görünüyor (tee olmadan komutları çalıştırıyorum ve ne yazması gerektiğini biliyorum). Bu gecikme bu tişeyi neredeyse işe yaramaz hale getirir - ya bazı kritik hatalar yazdırılacaksa, komutu durdurmam gerekiyor, ama çok geç olana kadar hiçbir şey görmeyeceğim?

    Bazı komutlar için çıktı yalnızca tam komut yapıldıktan sonra yazdırılır.

  3. Ayrıca, komut kullanıcı girişi istese bile, konsol / dosya çıkışı boş! Bu komut için ne beklediğini biliyorum ve gerekli metni körü körüne yazdırdı ve işe yaradı, ancak diğerleri için - çıktı olmadan, komut girişimi beklerken bir şeyin sonsuz olmasını beklerim!

Bu sorunların çözümü var mı? Değilse, PowerShell'deki bu tee şey tamamen işe yaramaz.


Binlerce komut dosyasında kullanılan bir aracın, yalnızca belirli gereksinimlerinizi karşılamayabileceğinden "tamamen yararsız" olduğuna inanmakta tereddüt ediyorum.
Stephen Jennings

Doğru, yani bu özel durumda işe yaramaz :) Bu kadar kötü sorunlara sahip olmaktan çok tee'yi yalnız bıraksam iyi olur.
race1

Yanıtlar:


7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Bkz Get-Help about_Redirection.
  2. Hatalara yakalanmalı, Ctrl+ değil C. Bkz Get-Help about_Try_Catch_Finally. Harici bir program mı yoksa komut dosyası mı çalıştırıyorsunuz?
  3. Anladığım kadarıyla, tipik olarak dize nesneleri bir satır sonu karakterine ulaşılana kadar kanaldan gönderilmez. Nedeni oldukça basittir: eğer bunu yapmadıysa, kısmi (okuma: eksik) dizeler borudan aşağı iner. Teekısmi dizeleri iyi işleyebilir, ancak diğer cmdlet'ler gibi ForEach-Objectveya Select-Objectkesinlikle yapmaz. Not Get-Contentözel bir anahtar var -ReadCountbiraz bu davranışı geçersiz kılar ve bir ile o olacak ciddiye karışıklık Select-Object -Skip/-First/-Last/-Uniqueborusu altındaki komuta.

Çalıştırdığınız harici programların PowerShell'in beklediği kurallara uymayacağı çok iyi olabilir. TeeÖrneğin, düzgün bir şekilde çağrılır Tee-Object, bu da size iyi çalıştığı şeyleri söylemelidir. Bu durumda, elde etmek hattı boyunca ileri olabilir tee.exegelen GNU Win32 Utils veya MSYS içeriği hemen iletme için tasarlanmıştır.


1. Teşekkürler; 2. Doğru, bazı kritik öngörülemeyen durumları kastetmiştim; 3. Eksik dizeler için neyin suçlu olduğunu anlamıyorum :) Sonunda komutlarım Python betikleri çalıştırıyor - bu kumaş komutları. Ben windows için derlenmiş linux utils tee.exe kullanmaya çalıştım - aynı sonuç, bazı durumlarda hiçbir çıkış. Bu, somut yapılandırmamın ve beton komut dosyalarının tee yardımcı programlarıyla hiç iyi çalışmayacağı anlamına mı geliyor? Teşekkür ederim.
race1

Bana python betiği yanlış davranıyormuş gibi geliyor.
Bacon Bits
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.