Tôi đang tìm kiếm một giải thích về sự khác biệt sau:PowerShell dòng 2.0 lệnh chuyển hướng
Với các kịch bản PowerShell sau foo.ps1:
write-host "normal"
write-error "error"
write-host "yay"
Chạy nó với
C:\>powershell .\foo.ps1 > out.txt 2>&1
Sản xuất:
normal
C:\foo.ps1 : error
At line:1 char:10
+ .\foo.ps1 <<<<
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,foo.ps1
Write-Host : The OS handle's position is not what FileStream expected. Do not use a handle simultaneously in one FileStream and in Win32 co
de or another FileStream. This may cause data loss.
At C:\foo.ps1:3 char:11
+ write-host <<<< "yay"
+ CategoryInfo : NotSpecified: (:) [Write-Host], IOException
+ FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.WriteHostCommand
Nhưng chạy với:
C:\>powershell .\foo.ps1 2>&1 > out.txt
Tạo (chính xác):
normal
C:\foo.ps1 : error
At line:1 char:10
+ .\foo.ps1 <<<<
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,foo.ps1
yay
Tôi gần như giải quyết bản thân mình vào suy nghĩ rằng thứ tự của các chuyển hướng tố quan trọng trong Windows, tuy nhiên tất cả các ví dụ trong TechNet usage page for command redirection hiển thị chuyển hướng tệp trước chuyển hướng stderr.
Ai đó có thể giải thích điều này cho tôi không?
Để tham khảo, điều này đã được thực hiện trên Server 2003 x64 SP2 với:
C:\>powershell get-host
Name : ConsoleHost
Version : 2.0
InstanceId : 53c90e87-ded1-44f9-8e8d-6baaa1335420
UI : System.Management.Automation.Internal.Host.InternalHostUserInterface
CurrentCulture : en-US
CurrentUICulture : en-US
PrivateData : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
IsRunspacePushed : False
Runspace : System.Management.Automation.Runspaces.LocalRunspace
và sử dụng ghi-sản lượng sản xuất cùng một kết quả.
(Câu hỏi này có liên quan đến công việc của tôi trong việc giải quyết this.)
Tôi không biết câu trả lời, nhưng tôi biết rằng Máy chủ lưu trữ được xử lý khác với tất cả các lệnh ghép ngắn Viết khác. Tôi tránh nó như bệnh dịch ngay bây giờ. Hãy thử kiểm tra của bạn với Write-Output. – EBGreen
cảm ơn về mẹo! thật không may, kết quả tương tự cũng xảy ra. –
Write-Output và Write-Host có các mục đích rất khác nhau. Write-Host ghi thông tin (văn bản) vào máy chủ PowerShell. Viết-đầu ra viết một đối tượng vào đường ống PowerShell, sau đó có thể bị chặn và xử lý bằng một lệnh chấp nhận đầu vào đường ống. Nếu không có lệnh như vậy được sử dụng, thì đầu ra đối tượng cũng được trả về cho máy chủ. –