2010-07-15 18 views
8

En un script de PowerShell, tengo algunos objetos que paso al Format-Table CmdLet.
La salida de mi escritura se parece a esto:PowerShell: Format-Table sin encabezados

Something... 

Operation AttributeName AttributeValue 
--------- ------------- -------------- 
Delete Member   John Doe 

Something else... 

Dado que el significado de los campos es bastante auto-explicativo, me gustaría quitar las cabeceras, la '---' separadores y las líneas en blanco el comienzo y el final de la salida de Format-Table.
No creo que CmdLet soporte esto (o al menos si hay un parámetro para hacer esto no pude encontrarlo).

¿Cuál sería la mejor manera de dejar solo las líneas con los valores reales de la salida de Format-Table?

Respuesta

19

Prueba el -HideTableHeaders parámetro a Format-Table:

gci | ft -HideTableHeaders 

(estoy usando PowerShell v2 No sé si esto era en v1..)

+0

perdido completamente el parámetro :( Gracias! –

+1

New-Alias ​​Rtfm Get-Help # :) – JasonMArcher

+1

Sí, esto funciona en v1 gracias! – tommed

4

El parámetro -HideTableHeaders desgracia todavía hace que el vacío líneas que se imprimirán (y los encabezados de tabla aparentemente aún se consideran para el ancho de columna). La única manera que sé que podría fiable trabajar aquí sería para dar formato a la salida de sí mismo:

| % { '{0,10} {1,20} {2,20}' -f $_.Operation,$_.AttributeName,$_.AttributeValue } 
0

Sé que es 2 años de retraso, pero estas respuestas me ayudaron a formular una función de filtro para objetos de salida y recortar las cadenas resultantes . Como tengo que formatear todo en una cadena en mi solución final, hice las cosas un poco diferente. largo lado, mi problema es muy similar, y se ve un poco como esta

$verbosepreference="Continue" 
write-verbose (ls | ft | out-string) # this generated too many blank lines 

Aquí está mi ejemplo:

función
ls | Out-Verbose # out-verbose formats the (pipelined) object(s) and then trims blanks 

Mi fuera detallado es el siguiente:

filter Out-Verbose{ 
Param([parameter(valuefrompipeline=$true)][PSObject[]]$InputObject, 
     [scriptblock]$script={write-verbose "$_"}) 
    Begin { 
    [email protected]() 
    } 
    Process { 
    $val += $inputobject 
    } 
    End { 
    $val | ft -autosize -wrap|out-string |%{$_.split("`r`n")} |?{$_.length} |%{$script.Invoke()} 
    } 
} 

Nota1: Esta solución no se escalará para que le gusten millones de objetos (no maneja la tubería en serie)

Nota2: Aún puede agregar una opción -nodadas. Si se está preguntando por qué utilicé un scriptblock aquí, es para permitir la sobrecarga, como enviar a un archivo de disco u otras transmisiones de salida.

1

Otro enfoque es utilizar ForEach-Object para proyectar elementos individuales con una cadena y luego usar el Out-String cmdlet para proyectar los resultados finales a una cuerda o una cadena matriz:

gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { "CID Key {0}" -f $_.Name } | Out-String 

#Result: One multi-line string equal to: 
@" 
CID Key HKEY_CLASSES_ROOT\CID\2a621c8a-7d4b-4d7b-ad60-a957fd70b0d0 
CID Key HKEY_CLASSES_ROOT\CID\2ec6f5b2-8cdc-461e-9157-ffa84c11ba7d 
CID Key HKEY_CLASSES_ROOT\CID\5da2ceaf-bc35-46e0-aabd-bd826023359b 
CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426 
"@ 

gci Microsoft.PowerShell.Core\Registry::HKEY_CLASSES_ROOT\CID | foreach { "CID Key {0}" -f $_.Name } | Out-String -Stream 

#Result: An array of single line strings equal to: 
@(
"CID Key HKEY_CLASSES_ROOT\CID\2a621c8a-7d4b-4d7b-ad60-a957fd70b0d0", 
"CID Key HKEY_CLASSES_ROOT\CID\2ec6f5b2-8cdc-461e-9157-ffa84c11ba7d", 
"CID Key HKEY_CLASSES_ROOT\CID\5da2ceaf-bc35-46e0-aabd-bd826023359b", 
"CID Key HKEY_CLASSES_ROOT\CID\d13ad82e-d4fb-495f-9b78-01d2946e6426") 

La ventaja de este enfoque es que se puede almacenar el resultado en una variable y NO tendrá líneas vacías.

1

Probar -ExpandProperty. Por ejemplo, utilizo esto para enviar la variable de limpieza a , de lo contrario, la variable tiene la información del encabezado almacenada.

Un ejemplo:

Get-Aduser -filter *| select name -expandproperty name 
0

Así es como puedo solucionar esto. Acabo de canalizar la salida a Out-String y luego pasar esa salida a la función .NET Trim:

(gci | ft -HideTableHeaders | Out-String).Trim() 

Esto tira a los saltos de línea antes y después de la tabla.

También puede utilizar TrimStart para ocuparse del salto de línea del encabezado si aún desea los saltos de línea finales.

(gci | ft -HideTableHeaders | Out-String).TrimStart() 
+0

¿Qué es gci? Yo soy 'somecode | donde bla -eq 'test'} | seleccionar contenido de texto' – user206168

Cuestiones relacionadas