Я ищу объяснение следующего несоответствия:PowerShell командной строки 2.0 Перенаправление
Учитывая следующий сценарий PowerShell foo.ps1:
write-host "normal"
write-error "error"
write-host "yay"
Запуск его с
C:\>powershell .\foo.ps1 > out.txt 2>&1
Производит:
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
Но работает с:
C:\>powershell .\foo.ps1 2>&1 > out.txt
Производит (правильно):
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
Я почти решен себя, думая, что порядок перенаправлении имело значение в Windows, однако все примеры в TechNet usage page for command redirection показывают перенаправление файлов, предшествующее перенаправлению stderr.
Может кто-нибудь объяснить это мне?
Для справки, это делается на Server 2003 x64 SP2 с:
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
и использование записью-вывод дает тот же результат.
(Этот вопрос связан с моей работой в решении this.)
Я не знаю ответа, но я знаю, что Write-Host обрабатывается иначе, чем все остальные командлеты Write. Теперь я избегаю его, как чумы. Попробуйте выполнить тест с помощью Write-Output. – EBGreen
спасибо за подсказку! к сожалению, тот же результат. –
Write-Output и Write-Host имеют совершенно разные цели. Write-Host записывает информацию (текст) на узел PowerShell. Write-Output записывает объект в конвейер PowerShell, который затем может быть перехвачен и обработан командой, которая принимает вход конвейера. Если такая команда не используется, то вывод объекта также выводится на хост. –