PowerShell và Tee


9

Tôi sử dụng lệnh này để xem đầu ra cả trong giao diện điều khiển và tệp:

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

Nó hoạt động không tốt như tôi mong đợi và tôi có một số câu hỏi:

  1. Làm thế nào để tôi chuyển hướng stderr cũng đến một tập tin?
  2. Đầu ra hoạt động rất lạ. Đối với một số lệnh, có một độ trễ lớn giữa văn bản được in và bảng điều khiển / tệp được cập nhật. Đối với một số lệnh khác, đầu ra dường như được cập nhật khi văn bản được in (Tôi chạy các lệnh không có tee và tôi biết nó nên in gì). Sự chậm trễ này làm cho tee này gần như vô dụng - điều gì sẽ xảy ra nếu một số lỗi nghiêm trọng sẽ được in vì vậy tôi cần dừng lệnh, nhưng tôi sẽ không thấy gì cho đến khi quá muộn?

    Đối với một số lệnh đầu ra chỉ được in sau khi hoàn thành lệnh đầy đủ.

  3. Hơn nữa, ngay cả khi lệnh yêu cầu đầu vào của người dùng, đầu ra của bàn điều khiển / tệp trống! Đối với lệnh đó, tôi biết những gì nó mong đợi và in một cách mù quáng văn bản cần thiết và nó đã hoạt động, nhưng đối với những người khác - không có đầu ra, tôi sẽ chờ điều gì đó xảy ra vô tận trong khi lệnh sẽ chờ đầu vào của tôi!

Có giải pháp cho những vấn đề này? Nếu không, điều tee này trong PowerShell là hoàn toàn vô dụng.


Tôi do dự khi tin rằng một công cụ được sử dụng trong hàng ngàn tập lệnh là "hoàn toàn vô dụng" chỉ vì nó có thể không đáp ứng các yêu cầu cụ thể của bạn.
Stephen Jennings

Phải, ý tôi là nó vô dụng trong trường hợp cụ thể này :) Tôi nên để tee một mình, hơn là sẽ có những vấn đề tồi tệ như vậy.
cuộc đua1

Câu trả lời:


7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Xem Get-Help about_Redirection.
  2. Bạn nên bẫy lỗi, không dựa vào Ctrl+ C. Xem Get-Help about_Try_Catch_Finally. Là lệnh bạn đang chạy một chương trình bên ngoài hoặc một tập lệnh?
  3. Theo tôi hiểu, thông thường các đối tượng chuỗi không được gửi xuống đường ống cho đến khi đạt được một ký tự cuối dòng. Lý do khá đơn giản: nếu nó không làm điều này, các chuỗi một phần (đọc: không đầy đủ) sẽ đi xuống đường ống. Teecó thể xử lý tốt một phần chuỗi, nhưng các lệnh ghép ngắn khác thích ForEach-Objecthoặc Select-Objectchắc chắn là không. Lưu ý rằng Get-Contentcó một công tắc đặc biệt -ReadCountphần nào ghi đè hành vi này và nó sẽ gây rối nghiêm trọng với một Select-Object -Skip/-First/-Last/-Uniquelệnh tiếp tục xuống đường ống.

Rất có thể các chương trình bên ngoài bạn đang chạy sẽ không tuân theo các quy ước mà PowerShell đang mong đợi. Tee, ví dụ, được gọi đúng Tee-Object, nó sẽ cho bạn biết những thứ mà nó hoạt động tốt. Trong trường hợp đó, bạn có thể đi xa hơn để lấy tee.exetừ GNU Win32 Utils hoặc MSYS được thiết kế để chuyển tiếp nội dung ngay lập tức.


1. Cảm ơn; 2. Đúng, tôi có nghĩa là một số tình huống quan trọng không lường trước được; 3. Tôi không hiểu điều gì là có lỗi đối với các chuỗi không hoàn chỉnh :) Cuối cùng, các lệnh của tôi chạy các tập lệnh Python - đó là các lệnh kết cấu. Tôi đã cố gắng sử dụng tee.exe từ các tiện ích linux được biên dịch cho windows - kết quả tương tự, không có đầu ra trong một số trường hợp. Điều đó có nghĩa là cấu hình cụ thể và tập lệnh cụ thể của tôi sẽ không hoạt động tốt với các tiện ích tee? Cảm ơn bạn.
cuộc đua1

Nghe có vẻ như kịch bản python đang hoạt động sai.
Bacon Bits
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.