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.)
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
gracias por la sugerencia! desafortunadamente, ocurre el mismo resultado. –
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. –