programing

형식 표를 사용하여 열 너비 제어

lastmoon 2023. 8. 30. 21:57
반응형

형식 표를 사용하여 열 너비 제어

목록에서 일부 PC의 마지막 재부팅 시간을 가져오려고 합니다.사용할 때

foreach ($pc in $pclist) {
  Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pc |
    select csname, lastbootuptime 
}

출력은 다음과 같습니다.

csname 마지막 부팅 시간------       --------------CONFA7-L1-1A 7/15/2016 오전 9:55:16CONFA7-L1-1F 5/31/2016 오전 8:51:46CONFA7-L1-1G 6/18/2016 오전 11:09:15CONFA7-L1... 6/26/2016 오후 5:31:31CONFA7-L3... 7/24/2016 오후 3:48:43

깔끔하긴 한데 PC 이름이 길면 전체 이름이 안 보이네요.그래서 파이프라인을 했습니다.Format-Table:

Get-CimInstance -ClassName win32_operatingsystem -ComputerName $pc |
  select csname, lastbootuptime |
  Format-Table  -HideTableHeaders 

그리고 제가 얻는 것은 다음과 같습니다.

CONFA7-L1-1A 7/15/2016 오전 9:55:16


CONFA7-L1-1E 7/21/2016 오후 12:58:16


CONFA7-L1-1F 5/31/2016 오전 8:51:46

여기에는 두 가지 문제가 있습니다.

  1. 제목이 없습니다.가 경할우를 하면.-HideTableHeaders필요하지 않은 모든 출력에 대한 표제가 있을 것입니다.

  2. 그 사이에 흰 공간이 많이 있습니다.

기본적으로 첫 번째 것과 유사한 출력만 받으면 되지만 전체 이름을 자르지는 않습니다.이걸 어떻게 고칠 수 있나요?

PetSerAlAnsgar Wiechers의 유용한 의견을 요약하고 보완하기 위해:

tl;dr

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

-AutoSize (컴퓨터 이름) 열이 모든 값을 전체적으로 표시하는 데 필요한 만큼 넓음을 보장하는 것입니다(단, 이 경우 이 값 자체가 한 줄에 너무 길어서 적합하지 않은 경우).-Wrap반드시 사용해야 합니다(아래 참조).

Get-CimInstance일련의 컴퓨터 이름을 사용하므로 루프가 필요하지 않습니다. 그러나 대상 컴퓨터가 병렬로 쿼리되기 때문에 반환되는 개체의 순서는 일반적으로 컴퓨터 이름의 입력 순서와 일치하지 않습니다. 이는 다음과 같이 수정됩니다.Sort-Object CSName콜.콜.

개별 열의 너비를 제어하는 방법

# 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

참고: Windows PowerShell에는 다음과 같은 기능이 있습니다.12...잘린 값은 3개의 개별 문자를 사용하여 잘라내기 때문에 PowerShell [Core] 6+에서는 단일 문자를 사용하는 것으로 개선되었습니다.(수평 타원, ).

형식 지정에 대해 자세히 알아보려면 계속 읽어보십시오.


핵심적인 질문은 모든 cmdlet 출력에 적용되는 형식 출력의 출력너비를 제어하는 방법에 대한 것입니다.

표 형식 출력에 cmdlet(직접)사용합니다. 목적은 다음과 같습니다.Select-Object출력을 포맷하는 것이 아니라 사용자 지정 개체를 만드는 것입니다. 이러한 개체(예: 미리 정의된 포맷 뷰가 없는 모든 유형의 인스턴스)에 4개 이하의 속성이 있는 경우 기본적으로 다음과 같이 포맷됩니다.Format-Table할 수는 (그러당신옵적수용없다할않면션그으렇그은); 지것나은을, 은▁behind▁(▁is그;것.Format-List암시적으로 사용되는.

  • Format-Table 는 항상 출력 라인을 사용 가능한 화면 폭으로 제한하며, 이는 다음을 의미합니다.

    • 열이 전혀 인쇄되지 않을 수 있습니다.
    • 수 , 은 특히마열값잘누이부리다락은있다같수음으로 표시됩니다..../그러나 아래 설명과 같이 인쇄된 모든 은 잘린 값을 가질 수 있습니다.
  • 긴 선을 작성하려면 파이프Format-Table을 의산물출로 출력합니다| Out-File -Width <int>또는| Out-String -Stream -Width <int>후자를 화면에 인쇄하면 줄이 감깁니다(단, 추가 줄 바꿈은 데이터의 일부가 아닙니다).

    • 주의: Windows PowerShell에서는 사용하지 마십시오.-Width ([int]::MaxValue)포맷 데이터가 포함된 형식의 테이블 정렬 데이터는 전체 너비의 공백과 함께 무조건 오른쪽 정렬되므로 출력 파일의 메모리/공간이 과도하게 소모될 수 있으며 메모리가 부족할 수도 있습니다.PowerShell Core에서는 이 문제가 v6.1 이상에서 해결되었습니다.

    • Windows(Unix와 유사한 플랫폼의 PowerShell Core에서는 작동하지 않음)에서는 다음을 사용할 수 있습니다.[console]::BufferWidth = <column-count>화면 버퍼를 넓혀서 줄이 길어지지 않고 가로 스크롤이 필요합니다.
      또한 Windows에서는 ISE가 아닌 일반 콘솔에서만 작동합니다.

  • 적합할 열 수를 간접적으로 결정하는 열 너비를 제어하려면 다음 모수를 사용합니다.

    • -AutoSize 말을Format-Table모든 데이터 값을 적합하도록 필요한 만큼의 너비로 열을 만드는 것이지만, 이 경우 표시되는 열 가 더을 수 있습니다(일반적으로 더 많은 열).

    • -Wrap 절단을 방지하기 위해 필요한 경우 열 값이 여러 줄에 걸쳐지도록 합니다. 다시 말해, 자동으로 결정되거나 고정된 열 너비(를 통해 지정됨)인 경우 마지막 열뿐만 아니라 모든Thanks, zett42. 에도 적용될 수 있습니다.width다음과 같이 입력)이 특정 값으로 초과됩니다.

    • 사용자 지정 열 너비를 지정하려면 항목이 있는 해시 테이블을 인수로 전달합니다(이를 계산된 속성이라고 함).Format-Table-Property매개 변수. 예: 다음 예제에서는 첫 번째 출력 열을 5자로 제한합니다.

        [pscustomobject] @{ prop1='1234567890'; prop2='other' } |
          Format-Table -Property @{ e='prop1'; width = 5 }, prop2
      
      • 기본적으로 값의 에 적용되는 잘라내기가 발생하는 경우 잘라내기 표시기.../항상 잘린 값의 마지막 3자(Windows PowerShell의 경우) / 마지막 문자(PowerShell [Core] 6+의 경우)를 차지합니다. 위의 예에서는prop1는 다음과 같이 .12.../1234…총 5챠 동안.

      • 대신 의 시작을 자르려면 열을 오른쪽 정렬로 변경해야 합니다.alignment = 'right':'left','center'세 번째 옵션입니다. 이 두 옵션 모두 의 끝을 잘라냅니다.

      • 값의 시작 부분에서 잘라내는 동안 왼쪽 정렬을 유지하려면 스크립트 블록에서 사용자 정의 식을 사용해야 합니다.{ ... }e(expression 항목:

        [pscustomobject] @{ prop1='1234567890'; prop2='other' } |
          Format-Table -Property @{ 
              n='prop1'; e={ $_.prop1 -replace '^.+(.{4})$', '…$1'}; width = 5 
            }, prop2
        
      • 참고: 하나 이상의 사용자 정의 너비를 지정하면 출력할 모든 속성을 명시적으로 열거해야 합니다.-Property사용자 정의 [1]너비가 필요 없는 인수도 마찬가지입니다.

  • PowerShell 7.1 기준 주의 사항:

    • 버그는 첫 번째 열(또한)에 해당되지 않는 한 사용자 지정 너비가 적용되는 것을 방지합니다. 또한 마지막 열에는 적용되지 않습니다. GitHub 이슈 #14676을 참조하십시오.

    • zett42가답변에서 지적하고 설명한 처럼, 첫 번째 열이 사용자 정의 너비를 지정하는 계산된 열이면, 사용자가 통과하지 않는 한 해당 열의 값이 실제로 얼마나 넓은지에 관계없이 나머지너비는 너비를 지정하지 않는 나머지 열에 고르게 분포됩니다.이 예상치 못한 동작은 GitHub 이슈 #14677에서 논의됩니다.


zett42가 지적했듯이 모든 열이 동일한 사용자 정의 너비를 가질 경우 이 요구 사항을 기술적으로 무시할 수 있습니다. 왜냐하면 속성 이름 문자열을e(Expression해시 테이블 항목은 와일드카드 패턴으로 해석되므로 해당 문자열은'*'모든 속성 이름과 일치합니다. 예:
[pscustomobject] @{ a=1; b=2 } | Format-Table @{ e='*'; width=10 }

를 일정 트림하고 폭을▁a▁if▁past▁pass▁you▁widths를 전달할 수 있습니다.Width각 속성 특성에 대한 속성입니다.

예를 들어 데이터를 다음과 같이 표시하려면 다음과 같이 하십시오.

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

이 기본입니다.Format-Table구문(명시 속성 목록 포함):

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

속성 이름만 전달하는 대신 다음에 메타데이터를 추가할 수 있습니다.

$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

참고: 이것이 mklement0의 더 완전한 답변 하단에 설명되어 있다는 것을 알고 있지만, 만약 이것이 당신의 사용 사례이고 당신이 빠르게 스크롤하고 있다면, 나는 이것이 이 전략을 높은 수준에서 강조하는 데 도움이 되기를 바랍니다.

언급URL : https://stackoverflow.com/questions/38554966/controlling-column-widths-with-format-table

반응형