2010-06-09 26 views
22

Tôi đang cố viết toàn bộ đầu ra (bao gồm lỗi) của tập lệnh thực thi lên bàn điều khiển và tệp cùng một lúc. Tôi đã thử một số tùy chọn khác nhau:Viết lỗi và xuất ra một tệp văn bản và Bàn điều khiển

.\MyScript.ps1 | tee -filePath C:\results.txt # only the output to the file 
.\MyScript.ps1 2> C:\results.txt # only the errors to the file and not the console 
.\MyScript.ps1 > C:\results.txt # only the output to the file and not the console 

Tôi hy vọng rằng tôi có thể sử dụng tệp để xem lại đầu ra/lỗi.

EDIT:

Đây là tập lệnh thử nghiệm hiện tại của tôi. Kết quả mong muốn là cả ba tin nhắn đều có thể được nhìn thấy.

function Test-Error 
{ 
    echo "echo" 
    Write-Warning "warning" 
    Write-Error "error"  
} 

Test-Error 2>&1 | tee -filePath c:\results.txt 
+0

@JasonMArcher cảm ơn bạn đã cập nhật thẻ về câu hỏi này! Có điều gì thêm chúng ta nên làm vì nó được cố định trong V3 và tôi đã được ban đầu bằng cách sử dụng V2? Cảm ơn. – smaclell

+0

Điều đó phụ thuộc, bạn chỉ muốn câu trả lời cho V2? Đây không phải là vấn đề dành riêng cho V2. Do đó, ý tưởng tốt nhất là ưu tiên các câu trả lời thực tế với phiên bản PowerShell mà chúng được sử dụng. :) – JasonMArcher

+1

Tôi đã thêm một số ghi chú cho các câu trả lời hiện có về khả năng tương thích với phiên bản PS. – JasonMArcher

Trả lời

19

Các bạn đã thử:

.\MyScript.ps1 2>&1 | tee -filePath c:\results.txt 

2>&1 là những gì bạn đang tìm kiếm

Lưu ý: Câu trả lời này hoạt động tuyệt vời trong PowerShell 1.0 và 2.0, nhưng sẽ chụp CHỈ đầu ra tiêu chuẩn và lỗi trong PowerShell 3.0 trở lên.

+0

Điều này rất gần. Tôi đã thêm tập lệnh mà tôi đang sử dụng để kiểm tra chức năng mong muốn của mình cho câu hỏi. Nó có thể nhận được đầu ra tiêu chuẩn và các lỗi nhưng không có cảnh báo. Bất kỳ ý tưởng nào khác? – smaclell

+1

Bạn không có nhiều lựa chọn tốt cho điều đó. Đọc các chủ đề trợ giúp cmdlet cho WRite-Warning và Write-Error và bạn sẽ thấy chúng cơ bản khác nhau. Ghi-Cảnh báo ghi vào máy chủ, Ghi-Lỗi ghi vào luồng đầu ra lỗi. Bạn có thể chuyển hướng các luồng, nhưng việc ghi vào máy chủ sẽ chuyển đến máy chủ lưu trữ. Lựa chọn duy nhất của bạn là các thông số phổ biến WarningVariable, v.v. Bạn sẽ có thể làm cho tất cả các cảnh báo/lỗi/dữ liệu đầu ra chuyển hướng đến một biến bằng cách sử dụng này. Xem chủ đề trợ giúp about_CommonParameters để biết thêm thông tin. –

+2

BTW, có vẻ như bạn không phải là người đầu tiên gặp phải điều này. Tôi chàng tôi đã từng làm việc với có một mô tả tốt về vấn đề ở đây: http://keithhill.spaces.live.com/blog/cns!5A8D2641E0963A97!6926.entry –

1

Tôi không thể nhận được cả lỗi và kết quả trong cùng một tệp. Một cách giải quyết mà làm việc cho tôi:

.\MyScript.ps1 2> C:\errors.txt | tee -filePath C:\results.txt

Cập nhật: Tôi đã làm việc hơn nữa và tôi đã sử dụng Start-TranscriptStop-Transcript trong chế độ của tôi để nắm bắt tất cả mọi thứ và nó làm việc!

+0

Câu trả lời khác ghi chính xác stderr và stdout vào tệp. Vấn đề ban đầu đã không thể bao gồm cả cảnh báo. 'Start-Transcript' và' Stop-Transcript' rất hữu ích và đáng để học hỏi. – smaclell

2

tôi đã không hài lòng với bất kỳ câu trả lời tôi đã tìm ra, vì vậy tôi trộn một ít và đến với điều này (trong PowerShell 3.0+):

$output = try{your_command *>&1}catch{$_} 

Với điều này bạn có thể chụp tất cả các lỗi và đầu ra được tạo ra bằng cách cố gắng sử dụng your_command.

Nó bắt ngoại lệ khi bạn sử dụng một lệnh không tồn tại:

PS C:\Users\jdgregson> $output = try{your_command *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
your_command : The term 'your_command' is not recognized as the name of a 
cmdlet, function, script file, or operable program. Check the spelling of the 
name, or if a path was included, verify that the path is correct and try again. 
At line:1 char:15 
+ $output = try{your_command 2>&1}catch{$_} 
+    ~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (your_command:String) [], Comman 
    dNotFoundException 
    + FullyQualifiedErrorId : CommandNotFoundException 

PS C:\Users\jdgregson> 

Nó bắt ngoại lệ khi bạn vượt qua đối số hợp lệ để một lệnh hiện có:

PS C:\Users\jdgregson> $output = try{cat C:\invalid-path.txt *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
cat : Cannot find path 'C:\invalid-path.txt' because it does not exist. 
At line:1 char:15 
+ $output = try{cat C:\invalid-path.txt 2>&1}catch{$_} 
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ObjectNotFound: (C:\invalid-path.txt:String) [Ge 
    t-Content], ItemNotFoundException 
    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetCo 
    ntentCommand 

Và nó bắt đầu ra nếu có không có vấn đề gì với lệnh của bạn cả:

PS C:\Users\jdgregson> $output = try{cat C:\valid-path.txt *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
this file is really here 

Nó hoạt động cho bạn ví dụ:

PS C:\Users\jdgregson> $output = try{Test-Error *>&1}catch{$_} 
PS C:\Users\jdgregson> echo $output 
echo 
WARNING: warning 
Test-Error : error 
At line:1 char:15 
+ $output = try{Test-Error *>&1}catch{$_} 
+    ~~~~~~~~~~~~~~~ 
    + CategoryInfo   : NotSpecified: (:) [Write-Error], WriteErrorExcep 
    tion 
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExceptio 
    n,Test-Error 
+0

Điều đó thật thú vị! cám ơn vì đã chia sẻ. – smaclell

Các vấn đề liên quan