Saltar al contenido

Controlar el ancho de las columnas con Format-Table

Después de tanto trabajar pudimos encontrar el resultado de esta contrariedad que algunos de nuestros usuarios de nuestro sitio han presentado. Si quieres aportar alguna información no dudes en aportar tu información.

Solución:

Para resumir y complementar los útiles comentarios hechos por PetSerAl y Ansgar Wiechers:

tl; dr

Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pclist |
  Sort-Object CSName |
    Format-Table CSName, LastBootUpTime -AutoSize

-AutoSize es lo que asegura que el CSName La columna (nombre de la computadora) es tan ancha como necesita ser mostrar todos los valores en su totalidad (a menos que estos valores sean demasiado largos para caber en una sola línea, en cuyo caso -Wrap debe usarse – ver más abajo).

Get-CimInstance toma un array de nombres de computadora, por lo que no es necesario un bucle; sin embargo, dado que se consultan los equipos de destino en paralelo, el orden de los objetos devueltos normalmente no coincidir con el orden de entrada de los nombres de las computadoras – esto se rectifica con el Sort-Object CSName llama.

Para controlar el ancho de columnas individuales:

# Instead of a simple property name, 'prop1', pass a *hashtable*
# (@ ... `) with a 'width' entry to Format-Table
PS> [pscustomobject] @ prop1='1234567890'; prop2='other'  |
       Format-Table -Property @ e='prop1'; width = 5 , prop2

prop1 prop2
----- -----
1234… other

Nota: en Windows PowerShell, verás solo 12... como el valor truncado, porque utiliza 3 individuales . caracteres para representar el truncamiento; en PowerShell [Core] 6+ esto se mejoró para usar un soltero personaje, (ELIPSIS HORIZONTAL, U+2026).

Sigue leyendo para aprender más sobre el formato de tablas.


En esencia, tu pregunta es sobre cómo controlar el ancho de la columna de salida de la salida tabular, que se aplica a alguna salida del cmdlet.

Utilizar el Format-Table cmdlet (directamente) para salida tabular, noSelect-Object: el propósito de Select-Object es crear objetos personalizados, no para formatear la salida; si tales objetos (generalmente, instancias de cualquier tipo sin vistas de formato predefinidas) resultan ser un refugio 4 o menos propiedades, tienen el formato predeterminado con Format-Table detrás de escena (pero no puedes aplicar opciones); de lo contrario, es Format-List que se utiliza implícitamente. Gracias, PetSerAl.

  • Format-Table limita invariablemente las líneas de salida a la ancho de pantalla disponible, lo que significa:

    • Es posible que las columnas no se impriman en absoluto.
    • Especialmente la última columna que se imprime puede tener sus valores truncados, con la parte faltante indicada por ... / – aunque tenga en cuenta que todos columnas impresas pueden tienen valores truncados, como se explica a continuación.
  • Si quieres crear líneas más largas, tubo Format-Tablesalida a | Out-File -Width o | Out-String -Stream -Width ; tenga en cuenta que si imprime este último en la pantalla, las líneas aparecerán envoltura (pero los saltos de línea adicionales no serán parte de los datos).

    • Consideración: Sobre Windows PowerShell, no utilice -Width ([int]::MaxValue), porque los datos con formato de tabla para tipos con datos de formato se rellenan incondicionalmente a la derecha con espacios hasta el ancho completo, lo que puede consumir cantidades excesivas de memoria / espacio en el archivo de salida e incluso puede quedarse sin memoria. En PowerShell Centro, esto se ha solucionado al menos a partir de la v6.1.

    • Una alternativa en Ventanas (no funciona en PowerShell Core en Unix-como plataformas) es usar [console]::BufferWidth = para ensanchar el búfer de pantalla para permitir líneas más largas que no se envuelven, pero requieren desplazamiento horizontal.
      Además, en Windows solo funciona en la consola normal, no en el ISE.

  • Para control anchos de columna – que determina indirectamente cuántas columnas cabrán – utilice los siguientes parámetros:

    • -AutoSize … dice Format-Table para hacer columnas tan anchas como sea necesario para adaptarse a todos los valores de datos, pero tenga en cuenta que esto puede resultar en que se muestren menos (menos típicamente: más) columnas.

    • -Wrap … marcas los valores de las columnas abarcan varias líneas, si es necesario, para evitar el truncamiento; de nuevo, esto puede aplicarse a todos columnasGracias, zett42., no solo el último, es decir, en caso de que un ancho de columna determinado o fijo automáticamente (especificado a través de un width entrada, como se muestra a continuación) pasa a ser superada por valores específicos.

    • Para especificar anchos de columna personalizados, pase un tabla hash con un width entrada como un argumento – una propiedad calculada para Format-Table‘s -Property parámetro; Por ejemplo, el siguiente ejemplo limita la primera columna de salida a 5 caracteres:

        [pscustomobject] @ prop1='1234567890'; prop2='other'  |
          Format-Table -Property @ e='prop1'; width = 5 , prop2
      
      • Si se produce un truncamiento, que se aplica al fin de valores por defecto, el indicador de truncamiento ... / invariablemente toma el últimos 3 caracteres del valor truncado (en Windows PowerShell) / Solo el último personaje (en Potencia Shell [Core] 6+); en el ejemplo anterior, el prop1 el valor se representa como 12... / 1234… para un total de 5 caracteres.

      • Para truncar el comienzo de valores en su lugar, debe cambiar la columna para que sea Derecha-alineado, con un alignment = 'right' entrada (por defecto es 'left', 'center' es la tercera opción; ambos truncan el fin de valores).

      • Si quieres retener izquierda alineación sin dejar de truncar en el comienzo de valores, tendrá que usar una expresión personalizada en un bloque de script ( ... ) asignado al e (expression) entrada:

        [pscustomobject] @ prop1='1234567890'; prop2='other'  |
          Format-Table -Property @ 
              n='prop1'; e= $_.prop1 -replace '^.+(.4)$', '…$1'; width = 5 
            , prop2
        
      • Nota: Especificar al menos un ancho personalizado significa que debe enumerar explícitamente todos propiedades a la salida en el -Property argumento, incluso los que no necesitan anchos personalizados.[1]

  • Advertencias, a partir de PowerShell 7.1:

    • A insecto evita que los anchos personalizados surtan efecto a menos que el primero la columna (también) tiene uno; además, es Nunca entra en vigor en el último columna: consulte el número 14676 de GitHub.

    • Como señala y demuestra zett42 en esta respuesta, Si el primero columna es una calculada que especifica un ancho personalizado, el ancho de línea restante es Distribuidos equitativamente entre las columnas restantes que no especifican por sí mismas un ancho de columna, independientemente de la amplitud de los valores de esas columnas, a menos que también pases -AutoSize. Este comportamiento inesperado se analiza en el número 14677 de GitHub.


[1] Como señala zett42, técnicamente puede omitir este requisito si todas las columnas deben tener el mismo ancho personalizado, porque pasar un nombre de propiedad string al e (Expression) La entrada de tabla hash se interpreta como una patrón comodín, así que eso string '*' partidos todos nombres de propiedad; p.ej:
[pscustomobject] @ a=1; b=2 | Format-Table @ e='*'; width=10

Si desea recortar los datos más allá de una cierta longitud y especificar manualmente los anchos de columna, puede pasar un Width propiedad para cada propiedad attribute.

Por ejemplo, si desea que sus datos se vean así:

Column 1    Column 2      Column 3      Column 4
--------    --------      --------      --------
Data        Lorem ip...   Lorem ip...   Important data

Aquí está lo básico Format-Table sintaxis, con una lista de propiedades explícitas:

$data | Format-Table -Property Col1, Col2, Col3, Col4 -AutoSize

En lugar de simplemente pasar los nombres de las propiedades, podemos agregar algunos metadatos adicionales a Property:

$a = @Expression=$_.Col1; Label="Column 1"; Width=30, 
     @Expression=$_.Col2; Label="Column 2"; Width=30, 
     @Expression=$_.Col3; Label="Column 3"; Width=30, 
     @Expression=$_.Col4; Label="Column 4"; Width=30
$data | Format-Table -Property $a

Nota: Me doy cuenta de que esto está cubierto en la parte inferior de la respuesta más completa de mklement0, pero si este es su caso de uso y se está desplazando rápidamente, espero que esto ayude a resaltar esta estrategia en un nivel alto

Comentarios y valoraciones del artículo

No se te olvide recomendar esta crónica si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 2 Promedio: 3.5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *