Select-Object용 PowerShell Expand 속성 사용하는 방법

PowerShell의 Select-Object cmdlet을 사용하면 입력된 객체 그룹에서 객체와 속성을 원활하게 선택할 수 있습니다. 그러나 때로는 더 많은 것을 알아야 할 때가 있습니다. ExpandProperty는 특정 속성에 대한 세부 정보를 확장하는 Select-Object의 스위치입니다.

이 예제 중심의 자습서에서 PowerShell Expand Property(-ExpandProperty) 스위치의 힘을 발견하세요.

전제 조건

이 자습서는 실전 데모로 진행됩니다. 따라오고 싶다면, PowerShell 5.1 이상이 설치된 Windows 기기가 필요합니다. 이 문서는 PowerShell 5.1이 설치된 Windows 10 기기를 사용합니다.

PowerShell Expand Property를 사용하여 속성 객체 값 추출하기

Windows 기기에 로그인하고 PowerShell 터미널을 실행합니다. 이 섹션에서는 Select-Object cmdlet 및 해당 ExpandProperty 스위치에 익숙해집니다.

1. Get-Service cmdlet을 실행하여 시스템의 모든 서비스 목록을 가져옵니다. 출력을 Select-Object cmdlet에 파이프하여 각 서비스 객체의 이름 속성만 선택하고 표시합니다. 아래에 표시된 것처럼요.

Get-Service | Select-Object -Property Name

이제 시스템의 서비스 이름 목록을 나타내는 객체의 단일 열을 볼 수 있어야 합니다.

Selecting the names of the existing system services

2. 이전 파이프라인의 끝에서 Get-Member cmdlet을 실행하여 아래와 같이 select-object가 반환하는 객체 유형을 확인합니다. 객체 유형을 알면 파이프라인을 확장하기 위한 함수나 cmdlet을 작성하는 데 도움이 됩니다.

Get-Service | Select-Object -Property Name | Get-Member

아래 스크린샷을 참조하면, -Property 스위치가 문자열 목록처럼 보이는 것을 확인할 수 있지만, 이것들은 Selected 목록의 System.ServiceProcess.ServiceController 객체입니다.

Viewing the type of a ServiceController object with Get-Member

3. Get-Members cmdlet을 mkdir로 대체하여 각 서비스에 대한 폴더를 자동으로 생성합니다. -first 5 스위치는 반환할 객체 수를 제한합니다. 이에 따라 mkdir 함수는 파이프라인의 객체를 기반으로 다섯 개의 폴더만 생성합니다.

Get-Service | Select-Object -Property Name -First 5 | mkdir

성공적인 시도를 나타내는 아래 스크린샷과 유사한 출력이 표시됩니다.

Creating a folder for the services on your system

4. mkdir을 rmdir로 대체하여 폴더를 제거합니다. -Verbose 스위치를 켜서 터미널에서 자세한 출력을 표시합니다.

Get-Service | Select-Object -Property Name -First 5 | rmdir -Verbose

rmdir cmdlet은 문자열을 예상하며 ServiceController 개체의 해시 테이블 표현을 처리할 수 없습니다. 여러 오류가 발생하여 시도가 실패해야 합니다. 아래 스크린샷과 같이

Demonstrating that some cmdlets expect string values instead of hashtables

5. -Property 스위치를 다음 스니펫과 같이 -ExpandProperty 스위치로 변경하십시오. 이렇게 하면 필요한 것이 문자열일 때 속성의 값을 문자열로 가져올 수 있습니다.

Get-Service | Select-Object -ExpandProperty Name -First 5 | rmdir -Verbose

rmdir과 결합하면 폴더를 자동으로 제거하는 시도가 오류 없이 성공해야 합니다. 아래 스크린샷과 같이

Deleting folders named after the services expanded

특정 속성을 가진 선택된 개체 집합 만들기

섹션의 코드 스니펫을 줄이려면 다음과 같이 기계에서 첫 20개 서비스에 대한 변수를 만듭니다.

Get-Service 명령을 실행하고 Select-Object cmdlet를 사용하여 처음 20개의 개체를 선택하고 개체를 $testServices라는 변수에 저장하십시오. 다음과 같이 Name, Status, 및 DependentServices 속성만 선택하십시오.

$testServices = Get-Service | Select-Object -Property Name,Status,DependentServices -First 20

PowerShell Expand Property 스위치는 한 번에 하나의 속성만 확장할 수 있습니다. 이에 반해 Property 스위치는 동시에 여러 속성을 선택할 수 있습니다.

변수 이름 $testServices를 실행하여 그 내용의 구조를 확인하십시오.

$testServices

아래 스크린샷과 유사한 서비스 속성을 표시하는 테이블이 표시됩니다.

Displaying the contents of $testServices

PowerShell Expand Property로 컬렉션 속성 확장하기

A PowerShell object can have properties that are collections of objects, also known as collection properties. In this section, you will learn how to use PowerShell Expand Property to expand a collection property to view its members’ properties.

$testServices 변수에 대해 Select-Object cmdlet를 실행하고 각 서비스의 DependentServices 속성을 확장하십시오.

$testServices | Select-Object -ExpandProperty DependentServices

DependentServices는 컬렉션 속성이므로 확장된 DependentServices에서 결과를 연결한 서비스 목록이 출력됩니다.

Expanding the DependentServices property

PowerShell Expand Property로 속성 결합하여 분류된 출력 생성

이제 종속 서비스 목록이 있지만, 이들이 무엇에 종속되는지 어떻게 알 수 있습니까? 이 섹션에서는 확장된 속성을 분류하는 데 -Property 스위치를 사용하는 방법을 배우게 됩니다.

DependentServices 속성을 Name으로 분류하려면 아래 명령을 실행하십시오.

$testServices | Select-Object -ExpandProperty DependentServices -Property Name

종속 서비스에 이미 Name 속성이 있으므로 분류 단계가 실패합니다.

아래 오류는 초기 서비스 목록($testServices에)에 확장된 DependentServices 속성의 Name 속성과 충돌하는 Name 속성이 이미 있음을 나타냅니다.

Attempting to group an expanded property by the parent object name

하나의 해결책은 식별자 속성을 다음과 같이 바꾸는 것입니다.

이전 명령의 출력을 수정하여 $depServ라는 변수에서 식별자 속성으로 지정된 ‘Depends On’이라는 계산된 속성을 지정합니다. ‘Depends On’은 $testService의 각 서비스의 Name 값을 포함할 것입니다.

속성 이름인 ‘Depends on’은 이 튜토리얼에서 임의로 선택된 것이며 사용자의 선택에 따라 임의의 표현이 될 수 있습니다.

$depServ = $testServices | Select-Object -ExpandProperty DependentServices -Property @{name="Depends On"; expr={$_.Name}}

$depServ를 Select-Object를 통해 종속 서비스의 Name, Status 및 Depends On 속성을 선택합니다.

$depServ | Select-Object -Property Name,Status,"Depends On"

이제 $testServices에 종속된 서비스를 확인할 수 있습니다.

Grouping an expanded property using a calculated property

다음과 같이 PowerShell Expand Property를 사용하여 Format-List를 결합하여 표시할 수 있습니다.

PowerShell은 특히 테이블 출력에서 표시할 객체 속성을 제한할 수 있으며 -ExpandProperty 스위치 출력도 동일한 경험을 할 수 있습니다. 이를 해결하기 위해 대신 목록으로 확장된 속성을 표시할 수 있습니다.

아래의 Get-Process cmdlet를 실행하여 explorer 프로세스가 사용하는 모든 모듈을 검색합니다. -ExpandProperty 스위치를 켜서 모듈의 속성을 표시합니다.

Get-Process explorer | select-object -ExpandProperty Modules

화면에 출력되는 결과는 자동으로 세 속성만 표시되도록 자르는 다음 스크린샷과 유사해야 합니다.

Viewing the truncated output of an expanded property

객체를 Format-List cmdlet로 파이프하여 모듈 객체의 모든 값을 더 관리하기 쉬운 목록으로 볼 수 있습니다.

Get-Process explorer | select-object -ExpandProperty Modules | Format-List

아래에 표시된대로 출력은 모든 속성과 그 값 목록을 표시합니다. 데이터를 파일에 저장하거나 다른 cmdlet로 전달하여 추가 처리할 수도 있습니다.

Converting the output of an expanded property to a list with Format-List

결론

여기까지 성공적으로 진행한 결과로, Select-Object cmdlet의 PowerShell Expand Property 스위치 (-ExpandProperty)의 이점을 어떻게 활용하는지 보았습니다. PowerShell은 많은 일반 작업에 유용한 cmdlet을 제공합니다. PowerShell Cat을 사용하여 파일을 빠르게 표시하는 방법을 배우면 새로운 지식을 보완할 수 있습니다.

Source:
https://adamtheautomator.com/powershell-expand-property/