2011-09-22 20 views
17

Estoy intentando ejecutar el siguiente código para recuperar una lista de usuarios locales en una máquina.Error de tabla de formato Powershell

gwmi win32_useraccount -Computername $env:computername -Filter "Domain='$env:computername'" | 
    Format-Table Name,Description 

me sale este error cuando se ejecuta dentro de un archivo PS1:

 
The object of type 
"Microsoft.PowerShell.Commands.Internal.Format.FormatStartData" is not 
valid or not in the correct sequence. This is likely caused by a 
user-specified "f ormat-table" command which is conflicting with the 
default formatting. 
    + CategoryInfo   : InvalidData: (:) [out-lineoutput], 
InvalidOperationException 
    + FullyQualifiedErrorId : 
ConsoleLineOutputOutOfSequencePacket,Microsoft.PowerShell.Commands.OutLineOutputCommand 

entiendo este problema surge debido a la forma en que las tuberías se analizan pero no puedo encontrar la manera de conseguir alrededor de él .

Respuesta

20

Los cmdlets Format-* no hacen la salida final, sino que transforman su entrada en una secuencia de objetos de formato. Estos objetos de formato se convierten a la salida real en uno de los cmdlets Out-, probablemente Out-Default.

Si una secuencia de comandos tiene múltiples conjuntos diferentes de objetos de formato que la salida final de los objetos fusionados de todas las expresiones en la secuencia de comandos Out-Default no puede resolver las incoherencias.

solución: añadir un Out-Sting al final de cada tubería de generación de salida para realizar el formato de una expresión a la vez:

gwmi win32_useraccount -Computername $env:computername -Filter "Domain='$env:computername'" | 
    Format-Table Name,Description | Out-String 
+0

El comando original no me falla. ¿Lo que da? – manojlds

+0

No reproduzco con este comando en mi siete, pero me lo agrega con otra clase de WMI. – JPBlanc

+0

@manojlds El problema surge cuando se ejecutan múltiples declaraciones que producen salida juntas en una sola ejecución. Puede obtener lo mismo en la línea de comando al tener dos comandos juntos en una sola línea de comando con el separador de declaración ';'. En algunos casos funciona, en otros no funciona. Pero forzar a la salida a ser cadenas que se muestran directamente siempre me ha funcionado. – Richard

1

también puede probar:

gwmi win32_useraccount -Computername $env:computername -Filter "Domain='$env:computername'" | Select-Object Name,Description | Format-Table Name,Description 

De hecho convertir a un intermedio PSCustomObject y todavía tiene un objeto.

Cuestiones relacionadas