PowerShell dan Tee

9

Saya menggunakan perintah ini untuk melihat output di konsol dan file:

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

Ini bekerja tidak sebaik yang saya harapkan dan saya punya beberapa pertanyaan:

  1. Bagaimana cara mengarahkan stderr juga ke file?
  2. Outputnya bekerja sangat aneh. Untuk beberapa perintah ada penundaan besar antara teks dicetak dan konsol / file diperbarui. Untuk beberapa perintah lain, output tampak diperbarui ketika teks dicetak (saya menjalankan perintah tanpa tee dan saya tahu apa yang harus dicetak). Penundaan ini membuat tee ini hampir tidak berguna - bagaimana jika beberapa kesalahan kritis akan dicetak sehingga saya perlu menghentikan perintah, tetapi saya tidak akan melihat apa pun sampai semuanya terlambat?

    Untuk beberapa perintah, output dicetak hanya setelah perintah lengkap dilakukan.

  3. Selain itu, bahkan jika perintah meminta input pengguna, output konsol / file kosong! Untuk perintah itu saya tahu apa yang diharapkan dan secara membuta mencetak teks yang diperlukan dan itu berhasil, tetapi untuk yang lain - tanpa output saya akan menunggu sesuatu terjadi tanpa batas sementara perintah akan menunggu input saya!

Apakah ada solusi untuk masalah ini? Jika tidak, tee tee di PowerShell ini sama sekali tidak berguna.

ras1
sumber
Saya ragu untuk percaya bahwa alat yang digunakan dalam ribuan skrip adalah "sama sekali tidak berguna" hanya karena mungkin tidak memenuhi persyaratan spesifik Anda.
Stephen Jennings
Benar, maksud saya tidak ada gunanya dalam kasus khusus ini :) Lebih baik saya tinggalkan tee sendirian, daripada akan memiliki masalah buruk seperti itu.
race1

Jawaban:

7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Lihat Get-Help about_Redirection.
  2. Anda seharusnya menjebak kesalahan, tidak bergantung pada Ctrl+ C. Lihat Get-Help about_Try_Catch_Finally. Apakah perintah Anda menjalankan program eksternal atau skrip?
  3. Seperti yang saya pahami, biasanya objek string tidak diturunkan ke pipa sampai karakter end-of-line tercapai. Alasannya cukup sederhana: jika tidak melakukan ini, string parsial (baca: tidak lengkap) akan turun ke pipa. Teemungkin menangani string parsial dengan baik, tetapi cmdlet lain suka ForEach-Objectatau Select-Objectpasti tidak. Catatan yang Get-Contentmemiliki saklar khusus -ReadCountyang agak mengabaikan perilaku ini, dan itu akan benar-benar mengacaukan dengan Select-Object -Skip/-First/-Last/-Uniqueperintah lebih jauh ke bawah pipa.

Mungkin saja program eksternal yang Anda jalankan tidak akan mematuhi konvensi yang diharapkan PowerShell. Tee, misalnya, dipanggil dengan benar Tee-Object, yang akan memberi tahu Anda hal-hal yang baik untuk dikerjakan. Dalam hal ini, Anda mungkin lebih jauh mendapatkan tee.exedari GNU Win32 Utils atau MSYS yang dirancang untuk segera meneruskan konten.

Bit Bacon
sumber
1. Terima kasih; 2. Benar, saya maksudkan beberapa situasi kritis yang tidak terduga; 3. Saya tidak mengerti apa yang salah untuk string tidak lengkap :) Akhirnya perintah saya menjalankan skrip Python - perintah fabric itu. Saya mencoba menggunakan tee.exe dari linux utils yang dikompilasi untuk windows - hasil yang sama, tidak ada output dalam beberapa kasus. Apakah itu berarti bahwa konfigurasi konkret dan skrip beton saya tidak akan berfungsi dengan baik dengan utilitas tee sama sekali? Terima kasih.
race1
Bagi saya itu terdengar seperti skrip python yang bertingkah buruk.
Bacon Bits