Cách chuyển hướng đầu ra của PowerShell sang tệp trong khi thực thi


198

Tôi có một tập lệnh PowerShell mà tôi muốn chuyển hướng đầu ra thành một tập tin. Vấn đề là tôi không thể thay đổi cách gọi kịch bản này. Vì vậy, tôi không thể làm:

 .\MyScript.ps1 > output.txt

Làm cách nào để chuyển hướng đầu ra của tập lệnh PowerShell trong khi thực thi?

Câu trả lời:


192

Có lẽ Start-Transcriptsẽ làm việc cho bạn. Trước tiên hãy dừng nó nếu nó đã chạy, sau đó khởi động nó và dừng nó khi hoàn tất.

$ ErrorActionPreference = "SilentlyContinue"
Bảng điểm dừng | không có giá trị
$ ErrorActionPreference = "Tiếp tục"
Bắt đầu-Transcript -path C: \ output.txt -append
# Làm một số thứ
Bảng điểm dừng

Bạn cũng có thể chạy cái này trong khi làm việc trên các công cụ và để nó lưu các phiên dòng lệnh của bạn để tham khảo sau này.

Nếu bạn muốn loại bỏ hoàn toàn lỗi khi cố gắng dừng bản ghi không phiên mã, bạn có thể thực hiện việc này:

$ErrorActionPreference="SilentlyContinue"
Stop-Transcript | out-null
$ErrorActionPreference = "Continue" # or "Stop"

13
Lưu ý rằng bản ghi bắt đầu không ghi lại Lỗi ghi, Viết dài dòng hoặc Ghi-gỡ lỗi ... chỉ là đầu ra tiêu chuẩn.
Richard Berg

6
@richard: nó xuất hiện để làm như vậy bây giờ. Có thể đây là bổ sung 2.0, không chắc những câu trả lời này có áp dụng cho 1.0 hay không.
Robert S Ciaccio

Tôi đang sử dụng gần như cùng một mã ở trên. vấn đề của tôi là, Stop-Transcript | out-null vẫn gửi đầu ra lỗi nếu quá trình sao chép không được bắt đầu. Tôi cần phải thay thế tin nhắn vì nó làm rối bố cục của tôi. sự tham gia âm thầm liên tục cũng không giúp được gì. có ý kiến ​​gì không
Mel

4
Cuối cùng, tôi tìm thấy các tài liệu cho Start-Transcript . (bực bội không được gắn nhãn với số phiên bản Powershell). Nó nói "Bản ghi bao gồm tất cả các lệnh mà người dùng gõ và tất cả đầu ra xuất hiện trên bàn điều khiển". Tuy nhiên, tôi đã thử nghiệm Start-Transcript trong Powershell 2.0 và thấy @Richard là đúng, lỗi tiêu chuẩn không được lưu vào bản ghi. Thật tệ
Đại tá Panic

Phương pháp này không xuất hiện để cảnh báo bạn nếu bạn thực sự có quyền ghi vào vị trí được chỉ định.
demongolem

51

Microsoft đã thông báo trên trang web Kết nối của Powershell (2012/02/15 lúc 4:40 chiều) rằng trong phiên bản 3.0, họ đã mở rộng chuyển hướng như một giải pháp cho vấn đề này.

In PowerShell 3.0, we've extended output redirection to include the following streams: 
 Pipeline (1) 
 Error    (2) 
 Warning  (3) 
 Verbose  (4) 
 Debug    (5)
 All      (*)

We still use the same operators
 >    Redirect to a file and replace contents
 >>   Redirect to a file and append to existing content
 >&1  Merge with pipeline output

Xem bài viết trợ giúp "about_Redirection" để biết chi tiết và ví dụ.

help about_Redirection

1
Không nói tôi thích giải pháp này. Trong thực tế, tôi thấy nó xấu xí, khó nhớ và không linh hoạt. Có vẻ như việc thêm các tham số bắt luồng vào Cmdlets Out- *, Set-Content và Add-Content sẽ thực hiện thủ thuật theo kiểu Powershelly hơn. Trong khi họ đang ở đó, họ cũng nên thêm một tham số -PassThru. Điều này sẽ làm cho hiệu quả của Tee-Object Cmdlet trở nên lỗi thời.
Nathan Hartley

Tôi bối rối, làm thế nào để trả lời câu hỏi đang được hỏi? "Làm cách nào để tôi chuyển hướng đầu ra của tập lệnh PowerShell trong quá trình thực thi '?
Zoredache

Bạn nói đúng, @Zoredache, tôi dường như đã bỏ qua yêu cầu "không thể thay đổi cách gọi tập lệnh này". Khi nắm bắt phần lớn đầu ra, Start-Transcript là cách để đi. Tôi có nên loại bỏ câu trả lời này?
Nathan Hartley

1
Đối với những người đến đây để chuyển hướng chung, Powershell đã thêm -OutVariable -WarningVariable -ErrorVariable, trực tiếp trả lời bình luận ngày 3 tháng 1 của tôi.
Nathan Hartley

2
Không, nó là tốt để rời khỏi nó. Với số lượng phiếu bầu tăng lên rõ ràng là hữu ích. Câu hỏi này gần như chắc chắn là nhận được lượt truy cập Google từ những người có khả năng thay đổi cách gọi kịch bản.
Zoredache

36

Sử dụng:

Write "Stuff to write" | Out-File Outputfile.txt -Append

2
không giải quyết câu hỏi của OP vì nó không hoạt động "trong khi thực thi". Nhưng tôi đã cho nó +1 vì dù sao cũng hữu ích khi biết cách chuyển sang Powershell.
Paul Masri-Stone

28

Tôi lấy nó bạn có thể sửa đổi MyScript.ps1. Sau đó cố gắng thay đổi nó như vậy:

$(
    Here is your current script
) *>&1 > output.txt

Tôi vừa thử điều này với PowerShell 3. Bạn có thể sử dụng tất cả các tùy chọn chuyển hướng như trong câu trả lời của Nathan Hartley .


Tôi thích giải pháp này. Bạn có thể sử dụng >> output.txt để chắp thêm. Bất cứ ai cũng biết nếu có một cách để tạo ascii này thay vì unicode?
Giáo sư Von Lemongargle

1
Bạn có thể thử một cái gì đó như thế này: *>&1 | Out-File $log -Encoding ascii -Append -Width 132nhưng Powershell thực sự xấu xí nếu bạn cần kiểm soát chính xác đầu ra.
mplwork

Tôi thích điều này vì nó hoạt động trong kịch bản của bạn. Hoàn hảo cho người lang thang.
dùng3505901

25

Một giải pháp khả thi, nếu tình huống của bạn cho phép:

  1. Đổi tên MyScript.ps1 thành TheRealMyScript.ps1
  2. Tạo một MyScript.ps1 mới trông giống như:

    . \ TheRealMyScript.ps1> output.txt


18
powershell ".\MyScript.ps1" > test.log

1
Đây là duy nhất trong số nhiều tùy chọn hoạt động cho đầu ra tập lệnh của tôi.
cori

17

Bạn có thể muốn xem qua cmdlet Tee-Object . Bạn có thể chuyển đầu ra sang Tee và nó sẽ ghi vào đường ống và cũng vào một tệp


1
"đầu ra" | Set-Content -PassThru và "đầu ra" | Thêm nội dung -PassThru cũng sẽ hoạt động như Tee-Object, với lợi ích bổ sung mà bạn có thể đặt Mã hóa.
Nathan Hartley

16

Nếu bạn muốn chuyển hướng thẳng tất cả đầu ra sang một tệp, hãy thử sử dụng *>>:

# You'll receive standard output for the first command, and an error from the second command.
mkdir c:\temp -force *>> c:\my.log ;
mkdir c:\temp *>> c:\my.log ;

Vì đây là một chuyển hướng thẳng đến tập tin, nó sẽ không xuất ra bàn điều khiển (thường hữu ích). Nếu bạn muốn đầu ra giao diện điều khiển, kết hợp tất cả đầu ra với *&>1, và sau đó đặt ống với Tee-Object:

mkdir c:\temp -force *>&1 | Tee-Object -Append -FilePath c:\my.log ;
mkdir c:\temp *>&1 | Tee-Object -Append -FilePath c:\my.log ;

# Shorter aliased version
mkdir c:\temp *>&1 | tee -Append c:\my.log ;

Tôi tin rằng các kỹ thuật này được hỗ trợ trong PowerShell 3.0 trở lên; Tôi đang thử nghiệm trên PowerShell 5.0.


4

Nếu bạn muốn làm điều đó từ dòng lệnh và không được tích hợp vào chính tập lệnh, hãy sử dụng:

.\myscript.ps1 | Out-File c:\output.csv

7
Người hỏi giải thích rõ ràng rằng cuộc gọi kịch bản không thể thay đổi.
Fer

2
Không liên quan đến câu hỏi, nhưng hữu ích cho tôi, tôi đã googling để có được Cú pháp đúng với Tube to Out-File.
gReX

0

Để nhúng phần này vào tập lệnh của bạn, bạn có thể làm như thế này:

        Write-Output $server.name | Out-File '(Your Path)\Servers.txt' -Append

Điều đó sẽ làm các trick.

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.