Sự khác biệt giữa PowerShell giữa Write-Host và Write-Output?


Câu trả lời:


82

Tóm lại, Write-Hostghi vào chính bảng điều khiển. Hãy coi nó như một MsgBox trong VBScript . Write-Outputmặt khác, ghi vào đường dẫn, vì vậy lệnh tiếp theo có thể chấp nhận nó làm đầu vào của nó. Bạn không bắt buộc phải sử dụng Write-Outputđể viết các đối tượng, như Write-Outputđược gọi ngầm cho bạn.

PS> Get-Service

sẽ giống như:

PS> Get-Service | Write-Output

16
Powershell thật là khó hiểu theo cách này. Bạn nên đọc liên kết này để có cảm giác về đường ống được đề cập trong powershell và cách các giá trị được trả về từ một hàm. "Từ khóa return trong PowerShell gây hiểu lầm - thành thật mà nói, tôi tránh nó, bởi vì nó không hoạt động giống như hầu hết các ngôn ngữ lập trình." - powershell.org/forums/topic/…
Jim Aho

1
Nếu bạn đang gọi một hàm có giá trị trả về, KHÔNG sử dụng Ghi-Đầu ra trong hàm đó hoặc chuỗi đó sẽ được trả về thay vì giá trị trả về của bạn. Mà có thể gây ra tất cả các loại tàn phá.
Brain2000

28

Write-Output gửi đầu ra đến đường ống. Từ đó nó có thể được chuyển đến một lệnh ghép ngắn khác hoặc được gán cho một biến. Write-Host gửi trực tiếp đến bảng điều khiển.

$a = 'Testing Write-OutPut'  | Write-Output
$b = 'Testing Write-Host' | Write-Host

Get-Variable a,b

Kết quả đầu ra:

Testing Write-Host

Name                           Value                                                                 
----                           -----                                                                 
a                              Testing Write-OutPut                                                  
b                                                  

Nếu bạn không cho Powershell biết phải làm gì với đầu ra cho đường ống bằng cách gán nó cho một biến hoặc đặt nó vào lệnh anoher, thì nó sẽ được gửi về trạng thái mặc định, thường là giao diện điều khiển nên kết quả cuối cùng sẽ xuất hiện giống nhau .


9

Write-Outputgửi dữ liệu dưới dạng một đối tượng thông qua đường ống. Trong ví dụ Câu hỏi, nó sẽ chỉ truyền một chuỗi.

write-hostlà máy chủ phụ thuộc. Trong bảng điều khiển write-hostvề cơ bản là làm [console]::WriteLine. Xem cái này để biết thêm thông tin.


4
Chỉ để làm rõ cho độc giả trong tương lai. Write-Ouputgửi các đối tượng. Lần này nó là một chuỗi, nhưng nói chung nó sẽ gửi các đối tượng và thường không cần thiết phải sử dụng vì nó là cách mặc định để xuất kết quả / dữ liệu :)
Frode F.

5

Một sự khác biệt khác giữa Ghi-Máy chủ và Ghi-Đầu ra:

  • Write-Host hiển thị thông báo trên màn hình, nhưng nó không ghi nó vào nhật ký

  • Write-Output ghi một thông báo vào nhật ký, nhưng nó không hiển thị trên màn hình.

Và Write-Host được coi là có hại. Bạn có thể xem giải thích chi tiết trong Ghi-Máy chủ lưu trữ Được coi là Có hại .


2
Tôi thấy Write-Output có hại hơn nhiều. Làm thế nào để bạn đảm bảo rằng một hàm thực sự trả về kết quả mong đợi của bạn chứ không phải một số đầu ra rác không mong muốn từ một lệnh?
MKesper

6
Tôi nghĩ Write-Outputsẽ hiển thị thông báo trên màn hình, nếu bạn đang tự chạy tập lệnh. Vì vậy, tôi không chắc bạn muốn nói gì với "Write-Output ghi một tin nhắn vào nhật ký, nhưng nó không hiển thị trên màn hình." ?
Jim Aho

Bạn không thể có thông tin trả về Ghi-Đầu ra ra màn hình nếu nó được sử dụng bên trong một hàm mà từ đó bạn thu kết quả đầu ra vào một biến. Nó thậm chí có thể làm hỏng đầu ra. Write-Host phù hợp hơn cho việc này.
galmok

@Summer Write-Output là có hại, Write-Information là tuyệt vời. Write-Output là kẻ thù của các hàm Powershell có giá trị trả về.
Brain2000

Theo tài liệu , "Bắt đầu từ Windows PowerShell 5.0, Write-Host là một trình bao bọc cho Ghi-Thông tin. Điều này cho phép bạn sử dụng Write-Host để phát ra đầu ra cho luồng thông tin."
Phistrom

0

Bạn có thể hiểu sự khác biệt giữa hai cmds với ví dụ dưới đây:

Ghi-máy chủ "msgtxt" | Get-Service Khi chạy ở trên, bạn sẽ nhận được đầu ra là "msgtxt"

Ghi đầu ra "msgtxt" | Get-Service Khi chạy ở trên, bạn sẽ gặp lỗi vì msgtxt không phải là tên của bất kỳ dịch vụ nào. (Trong điều kiện lý tưởng) (Vì bạn đang ghi nó vào một đường dẫn và nó đang được chuyển làm đầu vào cho Get-Service)

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.