PowerShell และ Tee


10

ฉันใช้คำสั่งนี้เพื่อดูผลลัพธ์ทั้งในคอนโซลและไฟล์:

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

มันใช้งานได้ไม่ดีเท่าที่ฉันคาดไว้และฉันมีคำถาม:

  1. ฉันจะเปลี่ยนเส้นทาง stderr ไปยังไฟล์ได้อย่างไร
  2. เอาต์พุตนั้นใช้งานได้แปลกมาก สำหรับคำสั่งบางคำสั่งจะมีการหน่วงเวลาอย่างมากระหว่างข้อความที่พิมพ์ออกมาและมีการอัปเดตคอนโซล / ไฟล์ สำหรับเอาต์พุตคำสั่งอื่น ๆ ดูเหมือนจะอัปเดตเมื่อมีการพิมพ์ข้อความ (ฉันเรียกใช้คำสั่งโดยไม่มีทีและฉันรู้ว่าควรพิมพ์อะไร) การหน่วงเวลานี้ทำให้ทีออฟนี้เกือบไร้ประโยชน์ - จะเกิดอะไรขึ้นถ้ามีข้อผิดพลาดร้ายแรงบางอย่างจะพิมพ์ดังนั้นฉันต้องหยุดคำสั่ง แต่ฉันจะไม่เห็นอะไรเลยจนกว่าจะสายเกินไป?

    สำหรับบางคำสั่งเอาต์พุตจะถูกพิมพ์หลังจากทำคำสั่งเต็มแล้วเท่านั้น

  3. นอกจากนี้แม้ว่าคำสั่งจะถามผู้ใช้อินพุตคอนโซล / ไฟล์เอาต์พุตจะว่างเปล่า! สำหรับคำสั่งนั้นฉันรู้ว่ามันคาดหวังอะไรและพิมพ์ข้อความที่ต้องการและทำงานได้ แต่สำหรับคนอื่น ๆ - โดยไม่มีผลลัพธ์ฉันจะรอสิ่งที่จะเกิดขึ้นอย่างไม่สิ้นสุดในขณะที่คำสั่งจะรออินพุตของฉัน!

มีวิธีแก้ไขสำหรับปัญหาเหล่านี้หรือไม่ ถ้าไม่เช่นนั้นสิ่งที่อยู่ใน PowerShell นั้นไร้ประโยชน์อย่างสมบูรณ์


ฉันลังเลที่จะเชื่อว่าเครื่องมือที่ใช้ในสคริปต์หลายพันรายการนั้น "ไร้ประโยชน์อย่างสมบูรณ์" เพียงเพราะอาจไม่เป็นไปตามข้อกำหนดเฉพาะของคุณ
Stephen Jennings

ใช่ฉันหมายถึงมันไร้ประโยชน์ในกรณีนี้ :) ฉันควรปล่อยให้ทีอยู่คนเดียวดีกว่าจะมีปัญหาที่ไม่ดี
race1

คำตอบ:


7
  1. My-Command 2>&1 | Tee-Object 'myfile.log'. Get-Help about_Redirectionดู
  2. คุณควรจะวางกับดักข้อผิดพลาดไม่ได้อาศัย+Ctrl ดูC Get-Help about_Try_Catch_Finallyคำสั่งที่คุณใช้อยู่เป็นโปรแกรมภายนอกหรือสคริปต์หรือไม่?
  3. ตามที่ฉันเข้าใจแล้วโดยทั่วไปแล้ววัตถุสตริงจะไม่ถูกส่งลงไปป์จนกว่าจะถึงตัวอักขระสุดท้ายของบรรทัด เหตุผลค่อนข้างง่าย: หากไม่ได้ทำเช่นนี้สตริงบางส่วน (อ่าน: ไม่สมบูรณ์) จะลงไปป์ Teeอาจจัดการกับสตริงบางส่วนได้ดี แต่ cmdlet อื่น ๆ ที่ชอบForEach-ObjectหรือSelect-Objectไม่แน่นอน โปรดทราบว่าGet-Contentมีสวิตช์พิเศษ-ReadCountซึ่งค่อนข้างจะแทนที่พฤติกรรมนี้และมันจะยุ่งกับการใช้Select-Object -Skip/-First/-Last/-Uniqueคำสั่งเพิ่มเติมลงไปในท่อ

อาจเป็นได้ว่าโปรแกรมภายนอกที่คุณใช้งานอยู่จะไม่เชื่อฟังข้อกำหนดที่ PowerShell คาดหวัง Teeตัวอย่างเช่นมีการเรียกใช้อย่างถูกต้องTee-Objectซึ่งควรบอกให้คุณทราบถึงชนิดของสิ่งที่ทำงานได้ดี ในกรณีที่คุณอาจจะไปตามเส้นที่จะได้รับtee.exeจากGNU Win32 UtilsหรือMSYSซึ่งถูกออกแบบมาสำหรับการส่งต่อเนื้อหาทันที


1. ขอบคุณ; 2. ถูกต้องฉันหมายถึงสถานการณ์ที่ไม่คาดฝันที่สำคัญ 3. ฉันไม่เข้าใจว่ามีความผิดอะไรกับสตริงที่ไม่สมบูรณ์ :) ในที่สุดคำสั่งของฉันก็เรียกใช้สคริปต์ Python - มันเป็นคำสั่งแบบแฟบริค ฉันพยายามใช้ tee.exe จาก linux utils รวบรวมสำหรับ windows - ผลลัพธ์เดียวกันไม่มีผลลัพธ์ในบางกรณี นั่นหมายความว่าการกำหนดค่าที่เป็นรูปธรรมและสคริปต์ที่เป็นรูปธรรมของฉันไม่สามารถทำงานได้ดีกับยูทิลิตี้ tee เลยหรือไม่ ขอบคุณ.
race1

ฟังดูแล้วเหมือนสคริปต์ของหลามที่ทำงานผิดปกติ
เบคอน Bits
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.