2012-01-30 26 views
9

Busco una explicación de la discrepancia siguiente:línea de comandos PowerShell 2.0 redirección

Dada la siguiente secuencia de comandos PowerShell foo.ps1:

write-host "normal" 
write-error "error" 
write-host "yay" 

Correr con

C:\>powershell .\foo.ps1 > out.txt 2>&1

Produce:

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 

Pero correr con:

C:\>powershell .\foo.ps1 2>&1 > out.txt

Produce (correctamente):

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 

casi me resolvieron en el pensamiento de que el orden de la redirección importaba en Windows, sin embargo todos los ejemplos en el TechNet usage page for command redirection muestran la redirección de archivos que precede a la redirección de stderr.

¿Alguien puede explicarme esto?

Como referencia, esto se está haciendo en el servidor 2003 SP2 x64 con:

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 

y el uso de escritura de salida produce el mismo resultado.

(Esta pregunta está relacionada con mi trabajo en la solución de this.)

+1

No sé la respuesta, pero sí sé que Write-Host se trata de manera diferente a todos los demás cmdlets de escritura. Lo evito como la peste ahora. Pruebe su prueba con Write-Output. – EBGreen

+0

gracias por la sugerencia! desafortunadamente, ocurre el mismo resultado. –

+1

Write-Output y Write-Host tienen propósitos muy diferentes. Write-Host escribe información (texto) en el host de PowerShell. Write-Output escribe un objeto en la canalización de PowerShell, que luego puede ser interceptado y procesado por un comando que acepta la entrada de canalización. Si no se utiliza dicho comando, la salida del objeto también se representa en el host. –

Respuesta

1

que se parece a un error en PowerShell 2.0. Traté de reproducir con la vista previa PowerShell 3.0 y ahora funciona como se esperaba.

+0

¿tiene una ... respuesta más feliz? –

+0

Actualizar a la CTP, reportar el problema a Msft

Cuestiones relacionadas