Windows Powershell 확장 유형 시스템

13969 단어
셸의 가장 매력적인 기능은 모든 대상을 텍스트로 변환할 수 있다는 것이다. 우리는 이미 대상 속성을 다른 판식으로 텍스트로 변환하고 출력하는 것을 사용한 적이 있다.더 놀라운 것은 Powershell이 이 대상의 본질을 가장 중요하게 대표하는 정보를 출력한다는 것이다.한 대상에는 많은 속성이 있는데, 왜 그 몇 개의 속성만 출력합니까?사용 중인 경우:
 
  
Dir | Format-Table * -wrap
PSP PSP PSC PSD PSP PSI Bas Mod Nam Par Exi Roo Ful Ext Cre Cre Las La La La At
ath are hil riv rov sCo eNa e   e   ent sts t   lNa ens ati ati tAc st st st tr
    ntP dNa e   ide nta me                      me  ion onT onT ces Ac Wr Wr ib
    ath me      r   ine                                 ime ime sTi ce it it ut
                      r                                     Utc me  ss eT eT es
                                                                    Ti im im
                                                                    me e  eU
                                                                    Ut    tc
                                                                    c
--- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- -- -- -- --
Mic Mic ABC C   Mic Tru ABC d-- ABC Pow Tru C: C:     201 201 201 20 20 20 Di
ros ros         ros   e     --      ers   e     Pow     1/1 1/1 1/1 11 11 11 re
oft oft         oft                 hel         ers     2/1 2/1 2/1 /1 /1 /1 ct
.Po .Po         .Po                 l           hel     9 1 9 9 9 1 2/ 2/ 2/ or
wer wer         wer                             lA     7:0 :05 7:0 19 19 19  y
She She         She                             BC      5:5 :55 5:5  9  1  9
ll. ll.         ll.                                     5       5   :0 7: :0
Cor Cor         Cor                                                 5: 05 5:
eF eF         eF                                                 55 :5 55
ile ile         ile                                                    5
Sys Sys         Sys
tem tem         tem
::C ::C
 
owe owe
rsh rsh
ell ell
AB
C

Powershell은 모든 속성을 최대한 출력하지만, 이러한 출력은 기본적으로 의미가 없고, 사용자가 읽는 데 불리하다.도대체 Powershell에서 기본적으로 이 속성만 표시하고 저 속성은 표시하지 않는 것은 무엇입니까?확장 유형 시스템(Extended Type System)으로, ETS는 파이프라인의 객체를 텍스트로 변환하는 메커니즘을 거시적으로 제어합니다.ETS는 두 부분으로 구성되어 있는데 하나는 대상을 제어하는 판식이고 일부는 대상을 제어하는 속성이 오늘날 첫 번째 부분에 주목한다.
텍스트 변환 불가역
파이프라인에서 객체 결과를 텍스트로 변환한 후에는 ETS에서 텍스트를 처리할 수 없으므로 텍스트를 더 이상 객체로 변환할 수 없습니다.ConvertTo-string을 통해 디렉토리 목록을 String으로 변환하면 Format-Table 및 Format-List 명령을 사용할 수 없습니다.
 
  
PS C:Powershell> $text= dir | Out-String
PS C:Powershell> $text

    : C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2011/12/19     17:05            ABC
d----        2011/12/19     17:06            ABD
d----        2011/12/19     17:06            ABE

PS C:Powershell> $text | Format-Table

    : C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2011/12/19     17:05            ABC
d----        2011/12/19     17:06            ABD
d----        2011/12/19     17:06            ABE

PS C:Powershell> $text | Format-List

    : C:Powershell

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2011/12/19     17:05            ABC
d----        2011/12/19     17:06            ABD
d----        2011/12/19     17:06            ABE


속성 선택
객체 결과를 표시할 때 Format-Table와 같은 명령을 사용하면 Format-Table가 각 속성의 값을 텍스트로 변환하기 때문에 ETS도 작동하지 않습니다.그래서 어떤 때는 그 속성을 스스로 명확하게 지정하고 생살권을 ETS에 넘기지 않는 것이 좋다.
 
  
PS C:Powershell> dir | Format-Table Mode,FullName

Mode  FullName
----  --------
d---- C:PowershellABC
d---- C:PowershellABD
d---- C:PowershellABE
d---- C:Powershellmyscript
-a--- C:Powershella.ccs
-a--- C:Powershella.csv
-a--- C:Powershella.html
-a--- C:Powershella.txt
-a--- C:Powershellalias


알려진 객체 서식 적용
서식 적용 명령을 사용하지만 특정 속성(예: dir | Format-Table)이 지정되지 않은 경우ETS는 처음으로 주먹다짐을 펼치며, 대상이 보여야 하고, 속성이 자동으로 선택되어야 한다는 것을 결정한다.ETS는 이러한 작업을 하기 전에 먼저 그 대상들이 텍스트로 변환될 수 있다는 것을 분명히 해야 한다.
 
  
PS C:Powershell> (dir)[0].GetType().FullName
System.IO.DirectoryInfo

Dir가 System을 반환합니다.IO.Directory Info 객체 및 이 객체에 포함된 System.IO.FileInfo 객체 및 System.IO.DirectoryInfo 하위 객체이렇게 하면 ETS는 자신의 내부 기록을 검사하고 내부 기록의 설정을 통해 대상을 텍스트로 변환할 수 있다.내부 레코드는 XML 파일이며 확장자는.ps1xml입니다.
 
  
PS C:Powershell> dir $PSHOME*format.ps1xml

    : C:WindowsSystem32WindowsPowerShellv1.0

Mode         LastWriteTime Length Name
----         ------------- ------ ----
-a---  2009/6/11      5:24  27338 Certificate.format.ps1xml
-a---  2009/6/11      5:24  27106 Diagnostics.Format.ps1xml
-a---  2009/6/11      5:24  72654 DotNetTypes.format.ps1xml
-a---  2009/6/11      5:24  24857 FileSystem.format.ps1xml
-a---  2009/6/11      5:24 257847 Help.format.ps1xml
-a---  2009/6/11      5:24  89703 PowerShellCore.format.ps1xml
-a---  2009/6/11      5:24  18612 PowerShellTrace.format.ps1xml
-a---  2009/6/11      5:24  20120 Registry.format.ps1xml
-a---  2009/6/11      5:24  24498 WSMan.Format.ps1xml


모든 대상은 이 XML 파일에 상세하게 정의되어 있으며, 정의는 대상 속성 지원을 포함하여 텍스트로 변환되며, 대상은 기본적으로 목록이나 표에 표시되어야 한다.한 줄 위의 혼합 명령인'Get-Process;dir'ETS가 지원하지 않는 것은 명령마다 판형을 명확하게 지정하는 것을 피하는 것이 가장 좋은 방법이라고 말한 적이 있다.
PS C:Powershell> Get-Process | Format-Table ; dir | Format-Table
알 수 없는 객체 서식 적용
ps1xml에서 정의된 대상은 이미 알고 있는 대상에 속하는데, 그 미지의 대상 ETS는 어떻게 처리해야 합니까?알 수 없는 객체의 경우 ETS는 객체의 속성이 5개 미만이면 테이블이 표시되고 그렇지 않으면 목록이 표시되는 규칙을 따릅니다.다음 예는 대상을 만들고 대상에 속성을 하나씩 추가합니다.
 
  
PS C:Powershell> $obj=New-Object PSObject
PS C:Powershell> Add-Member -Name A -Value 1 -InputObject $obj
MemberType: PS C:Powershell>
PS C:Powershell> Add-Member -MemberType NoteProperty -Name "A" -Value "1" -InputObject $obj
PS C:Powershell> $obj

A
-
1

PS C:Powershell> Add-Member -MemberType NoteProperty -Name "B" -Value "2" -InputObject $obj
PS C:Powershell> Add-Member -MemberType NoteProperty -Name "C" -Value "3" -InputObject $obj
PS C:Powershell> Add-Member -MemberType NoteProperty -Name "D" -Value "4" -InputObject $obj
PS C:Powershell> $obj

A B C D
- - - -
1 2 3 4

PS C:Powershell> Add-Member -MemberType NoteProperty -Name "E" -Value "5" -InputObject $obj
PS C:Powershell> $obj

A : 1
B : 2
C : 3
D : 4
E : 5


응급 모드
ETS가 출력에서 임계 상태를 발견하면 자동으로 목록 표시로 전환됩니다.예를 들어 "Get-Process;Dir"의 경우 ETS에서 Process 객체를 테이블 형식으로 내보내고 있지만 FileInfo 객체가 갑자기 발견되면 목록 모드로 전환하여 다른 유형의 객체를 내보냅니다.
열 숨기기
만약 알 수 없는 대상에 부딪히면 ETS는 파이프에서 출력된 첫 번째 결과에서 단서를 찾으려고 시도할 것이다. 이렇게 하면 이상한 현상을 초래할 수 있다.ETS는 알 수 없는 객체의 첫 번째 결과에 따라 속성을 판단하지만 첫 번째 결과의 속성이 항상 출력되는 것은 아닙니다.더 많은 속성을 포함하는 대상을 만났을 때 현재 선택한 속성 정보는 억제될 수 있습니다.다음 예제에서는 정보가 억제되고 Get-Process가 실행 중인 모든 프로세스를 반환한 다음 StartTime을 통해 정렬하여 각 프로세스의 이름과 시작 시간을 가장 출력합니다.
 
  
PS C:Windowssystem32> Get-Process | Sort-Object StartTime | Select-Object Name
,StartTime
Sort-Object : “StartTime” :“ 。”
:1 : 26
+ Get-Process | Sort-Object <<<< StartTime | Select-Object Name,StartTime
+ CategoryInfo : InvalidResult: (System.Diagnostics.Process (audi
odg):PSObject) [Sort-Object], GetValueInvocationException
+ FullyQualifiedErrorId : ExpressionEvaluation,Microsoft.PowerShell.Comman
ds.SortObjectCommand

위의 명령줄을 실행할 때 많은 오류 정보를 받을 수 있습니다.이 오류 정보는 명령에서 나온 것이 아니라 현재 컨트롤러에 관리자 권한이 없기 때문에 일부 시스템 프로세스가 접근을 거부할 수 있습니다.내보낸 프로세스 중 일부는 프로세스 이름 (Name) 만 있고, 시작 시간 (StartTime) 이 없으며, 시작 시간이 억제될 수 있습니다.Select-Object를 사용하면 대상의 일부 속성을 삭제할 수 있지만 대상 자체의 속성은 삭제할 수 없기 때문에 ETS는 파이프에서 대상을 다시 생성합니다. 유형은 시스템입니다.Management.Automation.PSCustomObject.
 
  
PS C:Powershell> Get-Process | foreach {$_.gettype().fullname} | select -f 1
System.Diagnostics.Process
PS C:Powershell> (Get-Process | foreach {$_.gettype().fullname} | select -f 1 Name ).getType().fullname
System.Management.Automation.PSCustomObject

PSCustomObject가 ETS 구성에 기록되지 않으면 모든 속성이 출력되기 때문입니다.파이프 결과는 이전에 StartTime 오름차순에 따라 배열되었기 때문에 앞의 프로세스는 권한 문제로 StartTime이 없습니다.
ETS 확장
ETS 구성에 포함된 유형 객체는 최상의 방법으로 텍스트로 변환됩니다.그러나 미지의 대상에 대한 표현이 완벽하지 않다. 표현이 완벽하지 않다고 해서 속수무책이 되는 것은 아니다.다행히 ETS 확충을 통해 ETS가 새로운 대상을 최선의 방법으로 처리할 수 있게 됐다.ETS 확충의 첫 번째 단계는 확충 대상 유형을 정하는 것이다.Get-WmiObject를 통해 WMI 서비스를 자주 받을 수 있습니다.그러나 Powershell의 기본 출력을 별로 좋아하지 않으면 ETS를 확충할 수 있다.
 
  
PS C:Powershell> Get-WmiObject Win32_Processor

__GENUS                     : 2
__CLASS                     : Win32_Processor
__SUPERCLASS                : CIM_Processor
__DYNASTY                   : CIM_ManagedSystemElement
__RELPATH                   : Win32_Processor.DeviceID="CPU0"
__PROPERTY_COUNT            : 48
__DERIVATION                : {CIM_Processor, CIM_LogicalDevice, CIM_LogicalEle


명령 반환 결과의 대상 유형을 먼저 결정합니다
 
  
PS C:Powershell> $object = Get-WmiObject Win32_Processor | Select-Object -first 1
PS C:Powershell> $object.GetType().FullName
System.Management.ManagementObject

검색 대상 유형: System.Management.ManagementObject는 다음에 구성 파일을 생성합니다.
 
  



CustomView

System.Management.ManagementObject





12



30









DeviceID


Description


ProcessorID









파일을 Win32 로 저장Processor.format.ps1xml을 사용하고 명령Update-FormatData를 사용하여 ETS에 불러오면 즉시 적용됩니다
 
  
PS C:Powershell> Update-FormatData .Win32_Processor.format.ps1xml
PS C:Powershell> Get-WmiObject win32_processor

Name         Description                    ID
----         -----------                    --
CPU0         x64 Family 6 Model 15 Stepp... BFEBFBFF000006FD


그러나 이러한 정의는 다른 WMI 객체를 가져올 때도 정의된 규칙에 따라 표시되는 단점이 있을 수 있습니다.
 
  
PS C:Powershell> Get-WmiObject Win32_Share

Name         Description                    ID
----         -----------                    --
             Remote Admin
             Default share
             HP LaserJet P2050 Series PCL6
             Remote IPC
             Printer Drivers


위의 상황은 WMI의 모든 객체가 System을 사용하기 때문입니다.Management.ManagementObject 유형이 반환됩니다.따라서 ETS는 틀리지 않았고, 원흉은 WMI라는 특수한 유형이었다.그래서 ETS를 확충할 때 반드시 구체적인 유형을 세분화해야 한다.사실 WMI 대상은 PSTypeNames 속성을 가지고 있으며 이를 통해 더욱 구체적인 유형을 찾을 수 있다.
 
  
PS C:Powershell> $object = Get-WmiObject Win32_Processor | Select-Object -first1
PS C:Powershell> $object.PSTypeNames
System.Management.ManagementObject#rootcimv2Win32_Processor
System.Management.ManagementObject
System.Management.ManagementBaseObject
System.ComponentModel.Component
System.MarshalByRefObject
System.Object

WMI 객체 유형의 상속 계층이 표시됩니다.그래서 우리가 필요로 하는 확장 대상 유형은 다음과 같다. 시스템.Management.ManagementObject#rootcimv2Win32_Processor
따라서 프로필을 수정하고 업데이트를 다시 불러와야 한다.업데이트 중 예외 Update-FormatData: 형식 데이터 파일을 로드하는 중 오류 발생: Microsoft.PowerShell,C:PowershellWin32_Processor.format.ps1xml: 파일이 'Microsoft.PowerShell' 에 이미 나타났기 때문에 건너뛰었습니다.
이상은 무시하고 다시 테스트할 수 있습니다.
 
  
PS C:Powershell> Get-WmiObject win32_Processor

Name         Description                    ID
----         -----------                    --
CPU0         x64 Family 6 Model 15 Stepp... BFEBFBFF000006FD

PS C:Powershell> Get-WmiObject win32_share

Name                       Path                       Description
----                       ----                       -----------
ADMIN$                C:Windows          Remote Admin
C$                         C:                        Default share


이렇게 ETS의 확장은 Win32에만 적용됩니다.Processor가 유효합니다.다른 상위 유형의 객체에는 영향을 주지 않습니다.

좋은 웹페이지 즐겨찾기