기본으로 돌아가기: PowerShell 객체 이해

PowerShell은 강력한 언어입니다. 그러나 이 스크립팅 언어를 강력하게 만드는 요소는 무엇일까요? PowerShell 객체입니다. 이러한 마법같은 객체들은 무엇이며 PowerShell은 어떻게 이 객체들과 작동하는 걸까요? 알아보기 위해 기대해주세요.

PowerShell은 객체 지향 언어이자 셸입니다. 이는 cmd나 Bash와 같은 전통적인 셸과는 달라요. 이러한 전통적인 셸은 주로 텍스트 또는 문자열에 초점을 맞추고 있으며 여전히 유용하지만 기능이 제한적입니다. PowerShell에서는 거의 모든 것이 객체입니다.

이 글에서는 PowerShell의 객체에 대한 몇 가지 핵심 개념을 배울 수 있을 것입니다. 이 글을 마치면 이 지식을 도움이 되는 예제 코드와 시각화를 통해 자신의 스크립팅에 적용하는 방법을 배웠을 것입니다.

시각적으로 더 배우고 싶다면, 이 글의 동반 비디오를 확인해보세요.

그러면 준비하세요! PowerShell에서 객체 개념을 습득하는 데 도움이 될 기억에 남을 경험을 하게 될 거에요!

전제 조건

이 글에서는 PowerShell의 객체에 대해 실습 중심으로 알아볼 것입니다. 코드 예제를 따라해보고 싶다면, Windows PowerShell 5.1 또는 PowerShell 6+ 버전을 사용하면 됩니다. 그러나 볼 수 있는 모든 예제는 Windows 10 빌드 1903에서 Windows PowerShell 5.1을 사용하여 수행됩니다.

객체의 구조 이해하기

PowerShell에서는 객체가 여기저기에 있습니다. 아마도 “객체는 어떻게 생겼을까요?“라고 스스로에게 물어볼 것입니다. 이 첫 번째 섹션에서는 객체의 구성 요소에 대한 개요를 얻게 될 것입니다. 객체가 객체인 이유에 대한 큰 그림을 이해한 후에는 몇 가지 코드 예제를 살펴볼 수 있습니다!

Get-Member로 객체 멤버 찾기

객체에는 여러 가지 유형의 정보가 연결되어 있습니다. PowerShell에서는 이 정보를 때로는 멤버라고 부릅니다. 객체 멤버는 객체와 관련된 모든 정보를 일반적으로 가리키는 용어입니다.

객체의 정보(멤버)를 찾으려면 Get-Member cmdlet을 사용할 수 있습니다. Get-Member cmdlet은 PowerShell에서 어떤 객체에 대해 사용 가능한 속성, 메서드 등을 찾을 수 있는 편리한 명령입니다.

예를 들어, 특정 개체에 대한 멤버를 보려면 Get-Service cmdlet을 통해 반환된 개체를 Get-Member cmdlet에 파이핑하여 다음과 같이 수행할 수 있습니다.

language-powershell
Get-Service -ServiceName 'BITS' | Get-Member

Get-Member cmdlet에 익숙해지세요. 이 기사에서는 자주 사용하게 될 것입니다.

PowerShell에서 출력을 생성하는 모든 명령은 Get-Member에 파이프될 수 있습니다. 그러나 이 cmdlet을 파이프라인의 맨 마지막으로 만들어야 합니다. 왜냐하면 이 cmdlet은 자체 출력으로 출력을 덮어쓸 수 있기 때문입니다.

객체 유형과 클래스

객체 지향 프로그래밍에 대해 자세히 설명하지 않고, 모든 객체에는 “스키마”가 있습니다. 객체의 “스키마”는 일종의 템플릿으로, 객체를 생성하는 청사진을 포함합니다. 그 청사진을 타입이라고 합니다.

PowerShell의 모든 객체는 특정한 타입을 갖습니다. 각 객체는 생성되는 데 사용된 청사진을 갖고 있습니다. 객체 타입은 클래스로 정의됩니다. 다음 예를 살펴보세요. 9는 숫자, Bluegill물고기, Labrador는 강아지 등입니다. 타입 앞에 클래스가 옵니다.

객체는 특정 타입을 갖는 클래스의 인스턴스입니다.

이 주제에 대해 깊이 알아가지 않아도 걱정하지 마세요. 소프트웨어 개발자가 아니라면, 이 시점에서는 의미론에 너무 신경 쓸 필요가 없습니다. 그러나 이는 기본 수준에서 알아야 할 중요한 개념입니다.

속성

객체에 대해 이해해야 할 가장 중요한 개념은 속성입니다. 속성은 객체를 설명하는 특성입니다. 객체에는 여러 가지 속성이 연결될 수 있으며, 다양한 속성을 나타냅니다.

객체에 어떤 속성이 있는지 알아보는 가장 쉬운 방법 중 하나는 Get-Member cmdlet을 사용하는 것입니다. 아래에서 MemberType 매개변수를 사용하여 Get-Member가 객체만 반환하도록 출력을 제한하는 것을 볼 수 있습니다. 또한 System.ServiceProcess.ServiceController의 객체 타입도 표시됩니다.

PS51> Get-Service | Get-Member -MemberType Property
Get-Service object properties

이제 앞서 다룬 BITS 서비스의 예를 살펴보고 아래 코드를 사용하여 해당 객체의 속성 값들을 확인해 보십시오. Get-Member cmdlet은 속성 이름을 찾을 수 있지만 값은 찾을 수 없습니다. 그러나 PowerShell의 Select-Object cmdlet을 사용하여 속성 값을 검사할 수 있습니다.

아래에서 볼 수 있듯이 StartType은 객체의 속성입니다. 반환된 객체는 여러 다른 멤버를 가지고 있지만 Select-Object cmdlet을 사용하여 출력을 속성만 표시하도록 제한하고 있습니다.

PS51> Get-Service -ServiceName 'BITS' | Select-Object -Property 'StartType'
BITS service start type

속성은 PowerShell에서 작업할 때 가장 일반적인 객체 구성 요소입니다.

별칭

일부 속성은 MemberTypeAlias인 경우가 있습니다. 별칭은 속성 이름의 의사 이름입니다. 때로는 속성에 더 직관적인 이름을 부여할 수 있습니다.

아래에 Get-Service cmdlet을 사용하여 별칭이 있는 객체의 예를 볼 수 있습니다. 속성 NameServiceName으로 별칭이 지정되고 RequiredServicesServicesDependedOn 속성으로 별칭이 지정됩니다.

PS51> Get-Service | Get-Member -MemberType 'AliasProperty'
AliasProperty members on service objects

속성에 별칭이 있는 경우 실제 속성 이름이 아닌 별칭 이름을 사용하여 해당 속성의 값을 참조할 수 있습니다. 이 예에서는 ServiceNameServicesDependedOn보다 NameRequiredServices와 같은 기술적인 속성이 더 직관적이고 입력하기 쉽습니다.

아래에서 이러한 별칭을 참조하는 예를 볼 수 있습니다.

# 실제 속성 이름 대신 AliasProperty 사용
PS51> $Svc = Get-Service -ServiceName 'BITS' # 작업 중인 객체
PS51> $Svc.Name
BITS
PS51> $Svc.RequiredServices

다음 출력을 확인해야합니다. 코드를 간결하고 명확하게 유지하는 것에 유의하십시오. 별칭을 사용하든 사용하지 않든 정보는 동일합니다:

Properties on the BITS service object

메소드

속성은 객체를 구성하는 하나의 요소에 지나지 않습니다. 메소드도 이해해야하는 중요한 개념입니다. 메소드는 객체에서 수행할 수 있는 작업입니다. 속성과 마찬가지로 Get-Member cmdlet을 사용하여 객체의 메소드를 확인할 수 있습니다.

Get-Member의 출력을 메소드만으로 제한하려면 MemberType 매개변수 값을 아래와 같이 Method로 설정하십시오.

PS51> Get-Service | Get-Member -MemberType 'Method'
Methods on service objects

초보자로서는 속성보다는 메소드를 훨씬 덜 사용하게 될 것입니다.

다른 MemberType

속성, 메소드, 별칭은 객체가 가질 수 있는 유일한 멤버 유형은 아닙니다. 그러나 이들은 여전히 가장 일반적인 멤버 유형입니다.

완전성을 위해, 아래에는 몇 가지 다른 유형의 멤버가 있을 수 있습니다.

  • 스크립트 속성 – 속성 값을 계산하는 데 사용됩니다.
  • 노트 속성 – 정적 속성 이름에 사용됩니다.
  • 속성 세트 – 이들은 이름이 시사하는 것처럼 속성 집합을 포함하는 별칭과 같습니다. 예를 들어, Get-CompInfo 함수에 대해 Specs라는 사용자 정의 속성을 만들었습니다. Specs는 사실상 Cpu, Mem, Hdd, IP 속성의 하위 집합입니다. 속성 세트의 주요 목적은 그룹의 속성을 연결하기 위해 단일 속성 이름을 제공하는 것입니다.

또한 객체 이벤트 개념을 언급하는 것도 중요합니다. 이벤트는 이 문서의 범위를 벗어납니다.

PowerShell에서 객체 작업하기

이제 객체가 무엇으로 구성되어 있는지 기본적으로 이해했으므로, 이제 코드를 작성하고 실제로 작업을 시작해 보겠습니다.

많은 PowerShell 명령은 출력을 생성하지만 때로는 이 출력을 모두 보지 않아도 됩니다. 출력을 제한하거나 조작해야 할 때가 있습니다. 다행히도, PowerShell에는 이를 수행할 수 있는 몇 가지 다른 명령이 있습니다.

아래에 표시된대로 Get-Service cmdlet을 사용하여 로컬 컴퓨터의 모든 서비스를 열거하는 예제부터 시작해 보겠습니다. 출력에서 많은 서비스(객체)가 반환됨을 알 수 있습니다.

PS51> Get-Service -ServiceName *
Using a wildcard on ServiceName parameter

반환된 객체 속성 제어

Get-Service 예제를 계속 진행하면, 각 속성을 보지 않아도 될 수도 있습니다. 대신 StatusDisplayName 속성만 보고 싶을 수 있습니다. 반환할 속성을 제한하려면 Select-Object cmdlet을 사용합니다.

Select-Object cmdlet은 PowerShell 파이프라인으로 반환되는 여러 속성을 “필터링”합니다. 반환되는 객체 속성을 “필터링”하려면 Property 매개변수를 사용하고 반환할 하나 이상의 속성을 쉼표로 구분하여 지정할 수 있습니다.

아래 예제에서는 StatusDisplayName 속성만 반환하는 예제를 볼 수 있습니다.

PS51> Get-Service -ServiceName * | Select-Object -Property 'Status','DisplayName'
Showing the Status and DisplayName properties

객체 정렬

어떤 서비스와 해당 상태를 나타내는 보고서를 작성하고 있다고 가정해보겠습니다. 정보를 쉽게 소화하기 위해 반환된 객체를 Status 속성의 값에 따라 정렬하고 싶을 것입니다. 이를 위해 Sort-Object cmdlet을 사용할 수 있습니다.

Sort-Object cmdlet을 사용하면 반환된 모든 객체를 수집하고 정의한 순서대로 출력할 수 있습니다.

예를 들어, Sort-ObjectProperty 매개변수를 사용하여 Get-Service에서 수신한 객체에 대해 정렬할 하나 이상의 속성을 지정할 수 있습니다. PowerShell은 각 객체를 Sort-Object cmdlet에 전달하고 속성의 값에 따라 정렬된 결과를 반환합니다.

아래 예제에서는 Status 속성으로 정렬된 모든 서비스 객체를 Sort-ObjectDescending 스위치 매개변수를 사용하여 내림차순으로 반환하는 예제를 볼 수 있습니다.

PS51> Get-Service -ServiceName * | Select-Object -Property 'Status','DisplayName' |
	Sort-Object -Property 'Status' -Descending
Using Sort-Object to sort service objects by Status in descending order

PowerShell에서 파이프 [ | ]는 필요할 때 사용해야 하는 몇 가지 줄 계속 기법 중 하나입니다. 백틱 대신 사용하세요.

오브젝트 필터링하기

어떤 경우에는 특정 기준으로 출력을 제한하고자 할 수도 있습니다. 오브젝트의 수를 필터링하는 한 가지 방법은 Where-Object cmdlet을 사용하는 것입니다.

Select-Object cmdlet은 특정 속성의 출력을 제한하는 반면, Where-Object cmdlet은 전체 오브젝트의 출력을 제한합니다.

Where-Object cmdlet은 SQL WHERE 절과 기능적으로 유사합니다. 이는 원본 소스의 필터링을 통해 특정 기준과 일치하는 일부 오브젝트만 반환합니다.

아마도 Status 속성 값이 Running인 오브젝트만 반환하고, DisplayName 속성 값이 A로 시작하는 오브젝트만 반환하려고 결정했을 수도 있습니다.

다음 코드 스니펫에서는 Select-ObjectSort-Object 사이에 Where-Object 참조가 삽입된 것을 볼 수 있습니다. FilterScript 매개변수를 통해 각 오브젝트가 충족해야 하는 필수 조건을 위한 스크립트 블록 값을 사용하여 원하는 종류의 쿼리를 작성할 수 있습니다.

콘솔로 출력이 반환되는 방식을 조작하려면 Format-Table cmdlet을 확인해보세요.

PS51> Get-Service * | Select-Object -Property 'Status','DisplayName' |
	Where-Object -FilterScript {$_.Status -eq 'Running' -and $_.DisplayName -like "Windows*" |
		Sort-Object -Property 'DisplayName' -Descending | Format-Table -AutoSize
Formatting object output

반환된 오브젝트의 개수 세기 및 평균 구하기

Get-Service 명령은 많은 다른 개체를 반환합니다. Where-Object cmdlet을 사용하여 이러한 개체 중 일부를 필터링했지만, 몇 개인지 알고 싶으신가요? Measure-Object cmdlet을 소개합니다.

Measure-Object cmdlet은 파이프라인을 통해 받은 개체 수를 세는 등의 수학 연산을 수행하는 PowerShell 명령입니다.

어쩌면 결합된 명령이 실행될 때 최종적으로 반환되는 개체의 총 수를 알고 싶을 수도 있습니다. 아래와 같이 최종 출력을 Measure-Object cmdlet에 파이프하여 반환되는 개체의 총 수를 찾을 수 있습니다.

PS51> Get-Service * | Select-Object -Property 'Status','DisplayName' |
	Where-Object {$_.Status -eq 'Running' -and $_.DisplayName -like "Windows*" |
		Sort-Object -Property 'DisplayName' -Descending | Measure-Object

명령이 처리된 후에는, 이 경우에는 Get-Service cmdlet으로 초기에 생성된 21개의 개체가 반환되었습니다.

Finding the number of objects returned with Measure-Object

어쩌면 반환되는 총 개체만 찾고 싶을 수도 있습니다. Measure-Object 명령은 Count 속성을 통해 찾은 총 개체를 반환하므로, Select-Object cmdlet을 다시 참조할 수 있습니다. 하지만 이번에는 Count 속성만 반환합니다.

PS51> Get-Service * | Select-Object -Property 'Status','DisplayName' |
	Where-Object {$_.Status -eq 'Running' -and $_.DisplayName -like "Windows*" |
		Sort-Object -Property 'DisplayName' -Descending |
			Measure-Object |
				# 처음부터 다시 시작하여 먼저 필터링하고 마지막에 서식을 지정합니다.
				Select-Object -Property 'Count'
Only returning the count property

루프를 통해 개체에 작업 수행하기

파이프라인을 통해 각 개체가 처리될 때마다 루프를 통해 각 개체에 작업을 수행할 수 있습니다. PowerShell에는 다양한 종류의 루프가 있지만, 파이프라인 예제에 대해서만 살펴보겠습니다. ForEach-Object cmdlet을 살펴보겠습니다.

ForEach-Object cmdlet을 사용하면 해당 cmdlet으로 흐르는 각 개체에 대해 작업을 수행할 수 있습니다. 이 동작은 예제를 통해 가장 잘 설명됩니다.

Get-Service 예제를 계속 사용하면, “Windows”로 시작하는 이름을 가진 실행 중인 Windows 컴퓨터의 모든 서비스를 찾고 싶을 것입니다. Where-Object cmdlet을 사용하여 이전에 했던대로 조건을 만들 수 있습니다.

Where-Object -FilterScript {$_.DisplayName -Like "Windows*" -and $_.Status -eq 'Running'}

하지만 이제 객체 전체나 몇 가지 속성을 반환하는 것이 아니라, 코드 **Write-Host -ForegroundColor 'Yellow' <ServiceName> "is running"을 사용하여 각 객체에 대한 문자열 <ServiceName> is running을 반환하고 싶습니다.

이제 출력을 조작하고 본인만의 문자열을 생성하고 있습니다. 이를 수행하기 위한 유일한 방법은 아래에 표시된 것처럼 ForEach-Object cmdlet을 사용하는 것입니다. Where-Object를 통해 반환된 각 개체에 대해 PowerShell은 코드 Write-Host -ForegroundColor 'Yellow' $_.DisplayName "is running"을 실행합니다.

PS51> Get-Service -ServiceName * |
	Where-Object {$_.DisplayName -Like "Windows*" -and $_.Status -eq 'Running'} | 
		Foreach-Object {
			Write-Host -ForegroundColor 'Yellow' $_.DisplayName "is running"
		}
Filtering by property with Where-Object

ForEach-Object cmdlet은 다양한 방법으로 유용하게 사용될 수 있습니다. 예를 들어, 추가 로직을 구축하여 찾은 각 서비스 개체를 열거하고 속성 값에 따라 출력 문자열의 색상과 단어를 변경하거나 중지된 서비스를 시작하는 등의 추가 작업을 수행할 수 있습니다.

이로써 제공되는 가능성을 상상해 보세요! 약간의 사고와 계획으로 단일 명령을 가져와 여러 개체에 손쉽게 실행하는 스크립트를 만들 수 있습니다.

개체 비교

때로는 두 개체를 살펴보고 속성 값들을 비교해야 할 때가 있습니다.

아마도 네트워크에 거의 동일한 두 개의 시스템이 있을 것입니다. 그러나 두 시스템 중 하나의 서비스에서 예상되는 구성 문제가 발생하고 있다고 판단합니다.

이러한 시스템이 네트워크의 서로 다른 부분에 있으므로 PowerShell 세션에서 정보를 수집하기 위해 원격 명령을 사용해야 할 것이라고 결론을 내립니다. 좋아하는 편집기를 열고 스크립트를 작성합니다. 아래에 나와 있는 대로이 스크립트는 두 개의 서버에 연결하고 각각의 모든 프로세스를 열거합니다.

$A = 'Svr01a.contoso.com'
$B = 'Svr02b.contoso.com'

$ProcA = Invoke-Command -Computername $A -Scriptblock {Get-Process -Name *}
$ProcB = Invoke-Command -ComputerName $B -Scriptblock {Get-Process -Name *}

이제 $ProcA$ProcB 변수에 각 컴퓨터의 모든 프로세스를 캡처했습니다. 이제 이들을 비교해야 합니다. 각 프로세스 세트를 수동으로 검토할 수도 있지만, 간편한 방법으로 Compare-Object라는 cmdlet을 사용할 수도 있습니다.

Compare-Object를 사용하면 두 개의 다른 객체의 속성 값을 비교할 수 있습니다. 이 cmdlet은 각 객체의 각 속성을 읽고 그 값들을 살펴보고, 기본적으로 다른 것과 동일한 것을 반환합니다.

Compare-Object를 사용하기 위해 ReferenceObjectDifferenceObject 매개변수를 지정하고 매개변수 값으로 각 객체를 제공하면 됩니다. 아래에 표시된 대로입니다.

Compare-Object -ReferenceObject $ProcA -DifferenceObject $ProcB

기본적으로 Compare-ObjectSideIndicator 속성으로 표시된 차이점만 반환합니다. 사용되는 기호 또는 사이드 인디케이터는 비교되는 객체의 일치를 나타내기 위해 >, <, =입니다.

Running Compare-Object

IncludeEqual 매개변수를 Compare-Object와 함께 사용하여 동일한 객체 속성을 반환할 수 있습니다. 그렇다면, 측면 표시로 ==가 표시됩니다. 마찬가지로, 차이점을 제외하려면 ExcludeDifferent를 사용할 수 있습니다.

Compare-Object cmdlet은 매우 유용한 cmdlet입니다. 더 자세히 알고 싶다면 온라인 설명서를 방문해보세요.

사용자 정의 객체 다루기

객체가 무엇이며 어떻게 다룰 수 있는지에 대해 잘 이해했다면, 이제 자신만의 객체를 만드는 것이 시간입니다!

해시테이블을 사용하여 사용자 정의 객체 생성하기

자신만의 객체를 만드는 한 가지 방법은 해시테이블을 사용하는 것입니다. 해시테이블은 객체의 속성을 생성하는 데 필요한 키/값 쌍의 집합입니다.

아래 예제에서는 해시테이블을 사용하여 몇 개의 키/값을 가진 사용자 정의 PowerShell 객체를 만드는 방법을 알아봅시다. 해시테이블인 $CarHashtable을 정의한 후, PsCustomObject 타입 가속기를 사용하여 캐스팅합니다.

pscustomobject 유형 가속기는 pscustomobject 클래스의 인스턴스를 빠르게 만드는 방법입니다. 이 동작을 캐스팅이라고 합니다.

아래 코드 스니펫의 끝에는 다섯 개의 속성이 할당된 pscustomobject 유형의 개체($CarObject)가 있습니다.

## 해시테이블 정의
$CarHashtable = @{
	Brand      = 'Ford'
	Style      = 'Truck'
	Model      = 'F-150'
	Color      = 'Red'
	Drivetrain = '4x4'
}

## 개체 생성
$CarObject = [PsCustomObject]$CarHashTable

또한 New-Object cmdlet을 사용할 수도 있습니다. 동일한 해시테이블을 사용하고 pscustomobject 유형 가속기를 사용하는 대신 New-Object를 사용하여 긴 형식으로 수행할 수 있습니다. 이에 대한 예제는 아래에 표시되어 있습니다.

$CarHashtable = @{
	Brand      = 'Ford'
	Style      = 'Truck'
	Model      = 'F-150'
	Color      = 'Red'
	Drivetrain = '4x4'
}
#개체 생성
$CarObject = New-Object -TypeName PsObject -Properties $CarHashtable

$CarObject가 생성되면 아래와 같이 각 속성을 내장된 PowerShell cmdlet인 Get-Service와 같이 참조할 수 있습니다.

Inspecting object properties

속성 추가 및 제거

사용자 지정 개체를 만들 수 있을 뿐만 아니라 그에 속성을 추가할 수도 있습니다. Get-Member cmdlet을 기억하십니까? Get-Member에는 Add-Member라는 관련이 있습니다. Add-Member cmdlet은 멤버를 열거하지 않고 추가합니다.

이전에 만든 사용자 지정 개체를 사용하여 예를 들어, 해당 개체에 모델 연도 속성을 추가하고 싶을 수 있습니다. 이를 위해 개체를 Add-Member에 파이핑하고 다음을 지정합니다:

  • 회원 유형(이 경우에는 단순한 NoteProperty)
  • 속성 이름(Year)
  • 속성 값(Value)

아래 예시에서 확인할 수 있습니다.

PS51> $CarObject | Add-Member -MemberType NoteProperty -Name 'Year' -Value '2010'

아래에서 다시 확인할 수 있듯이 다른 속성과 마찬가지로 표시됩니다.

Adding and viewing a new property

많은 다른 유형의 멤버를 추가하는 데 유사한 기법을 사용할 수 있습니다. 더 자세히 알아보려면 Add-Member 문서를 확인해보세요.

객체에서 멤버를 제거하는 것도 매우 쉽습니다. Remove-Member cmdlet은 없지만, 아래에 표시된 대로 객체에 Remove() 메서드를 호출하여 제거할 수 있습니다. 다음 섹션에서 메서드에 대해 자세히 알아보게 될 것입니다.

PS51> $CarObject.psobject.properties.remove('Drivetrain')

메서드에 대한 간단한 소개

이 문서 전체에서 속성과 함께 작업했습니다. 속성 값을 읽고, 직접 속성을 만들고, 추가하거나 제거했습니다. 하지만 환경에는 실제로 별다른 변화를 주지 않았습니다. 서버 상태를 변경하지 않았습니다. 이제 메서드를 통해 몇 가지 조치를 취해보겠습니다.

메서드는 어떤 종류의 작업을 수행합니다. 객체는 정보를 저장하는 반면, 메서드는 작업을 수행합니다.

예를 들어, Stop-Service 명령어를 알고 있을 수 있습니다. 이 명령어는 Windows 서비스를 중지합니다. 이를 위해 Get-Service에서 객체를 가져와서 해당 객체를 Stop-Service로 직접 전달하여 작업을 수행할 수 있습니다.

아래에서 BITS 서비스를 중지하는 예제를 볼 수 있습니다. 이 예제에서 BITS 서비스를 중지한 다음 상태를 확인하여 중지되었는지 확인합니다. cmdlet을 사용하여 두 가지 작업을 수행했습니다. 서비스를 중지하고 상태를 확인합니다.

PS51> Get-Service -ServiceName 'BITS' | Stop-Service
PS51> Get-Service -ServiceName 'BITS'

별도의 명령을 실행하는 Get-Service를 두 번 실행하는 대신 서비스 객체에 내장된 메서드를 활용할 수 있습니다. 많은 객체에는 메서드가 있습니다. 이 경우 Stop-Service를 사용하고 두 번째 Get-Service 참조조차 필요하지 않습니다.

Running commands to stop and start a service

서비스 객체 자체에서 메서드를 호출하여 단일 객체를 사용하여 중지하고 업데이트된 상태를 검색할 수 있습니다. 아래에서 이를 확인할 수 있습니다.  Stop()Start() 메서드를 사용하여 명령과 마찬가지로 서비스를 조작할 수 있습니다.

서비스 상태가 변경된 후에도 Status 속성 값이 최신 상태인지 확인하기 위해 Refresh() 메서드를 호출하여 또 다른 Get-Service 명령을 호출할 수 있습니다.

## 로컬 머신에서 BITS를 중지합니다.
$Svc = Get-Service -ServiceName 'BITS' #작업중인 개체
$Svc.Stop() #수행하는 방법 / 동작
$Svc.Refresh() #수행하는 방법 / 동작
$Svc.Status #속성

#로컬 머신에서 BITS 시작
$Svc = Get-Service -ServiceName 'BITS' #작업중인 개체
$Svc.Start() #수행하는 방법 / 동작
$Svc.Refresh() #수행하는 방법 / 동작
$Svc.Status #속성

다음 출력을 확인해야합니다:

Executing methods on the service object

메서드에 대한 자세한 정보는 about_Methods 도움말 항목을 참조하십시오.

결론

PowerShell에서 개체로 수행할 수 있는 많은 작업들이 있습니다. 이 문서는 개체가 무엇이고 어떻게 동작하며 조작하고 생성하는지에 대해 시작하는 데 도움을 주는 기초적인 내용을 다루었습니다. 몇 가지 다른 시나리오를 살펴보면서 코드 샘플을 통해 이러한 작업을 수행하는 방법을 배웠습니다. 차분하고 PowerShell을 배우세요. 읽어 주셔서 감사합니다!

Source:
https://adamtheautomator.com/powershell-objects/