2012-01-30 2 views
9

Я ищу объяснение следующего несоответствия: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.)

+1

Я не знаю ответа, но я знаю, что Write-Host обрабатывается иначе, чем все остальные командлеты Write. Теперь я избегаю его, как чумы. Попробуйте выполнить тест с помощью Write-Output. – EBGreen

+0

спасибо за подсказку! к сожалению, тот же результат. –

+1

Write-Output и Write-Host имеют совершенно разные цели. Write-Host записывает информацию (текст) на узел PowerShell. Write-Output записывает объект в конвейер PowerShell, который затем может быть перехвачен и обработан командой, которая принимает вход конвейера. Если такая команда не используется, то вывод объекта также выводится на хост. –

ответ

1

Это похоже на ошибку в PowerShell 2.0. Я попытался воспроизвести с предварительным просмотром PowerShell 3.0, и теперь он работает так, как ожидалось.

+0

у вас есть ... более счастливый ответ? –

+0

Обновить до CTP, сообщить о проблеме Msft

Смежные вопросы