파워셸을 공부하면서 초심을 잃지 않게,
초반에 혼자 공부했던 기초 개념들을 다시 똑바로 잡기 위해서 정리글을 남겨보려 한다.
[내가 잊어먹으면 보러올려고...ㅎㅎ]
1. 파워셸 명령어의 리턴은 개체
2. 파이프라인 매개변수 바인딩 방식
3. 명령 결과 필터링
파워셸 명령어의 리턴은 개체
파워셸 명령어의 결과는 리눅스 명령 쉘과는 다른 구조를 가지고있다. 예를 들어 Get-Process와 같은 명령의 경우 아래와 같이 결과가 리턴되는데, 이는 컬렉션이라고 하는 개체(Object)들의 복수 데이터이다.
그럼 개체는 무엇을 뜻할까?
위 사진이 개체들의 복수 데이터니까 당연히 개체는 개별 프로세스 하나하나의 데이터를 뜻한다.
또 한번 들어가서, 개체는 멤버로 이루어져 있다. 멤버에는 - 속성, 메서드, 이벤트가 있으며
즉, 개체는 속성, 메서드, 이벤트가 있고 이 셋을 묶어서 개체의 멤버라고 한다.
속성(Property) - 개체의 특성이며, 주로 명사를 사용. ex) Name, PID, 이벤트 로그 메시지 등
메서드(Method) - 개체의 동작이며, 동사를 사용한다. 프로세스 개체라면 종료 동작이라던지, 이벤트 로그 개체면 로그를 지우는 동작 등이 있겠다.
이벤트(Event) - 개체에 특정 상황을 발생시킨 원인을 이벤트라고 한다.
파워셸은 Get-Member 라는 명령어로 개체의 멤버를 볼 수 있다.
아래 사진을 보면,
프로세스의 개체에는 Name, NPM 이라는 속성(Property)와 Close, GetType 이라는 메소드(Method)가 멤버로 속해있는 것을 볼 수 있다.
이렇게 파워셸을 명령어는 리눅스 쉘처럼 문자열이 아닌 개체의 형식으로 리턴을 주기때문에 리턴값을 다룰 때에도 문자열과는 다른 절차를 취해야 한다.
파이프라인 매개변수 바인딩 방식
파이프라인에 대한 설명은 생략하고, 파워쉘에서 파이프라인과 매개변수의 바인딩 방식에 대해서 정리하겠다.
크게 두 가지 방식이 존재한다. ByValue 와 ByPropertyName 이다.
ByValue
항상 ByPropertyName 보다 먼저 시도되는 방식이다. 해당 방식이 실패했을 때 ByPropertyName 방식이 시도된다.
명령어들을 Help 명령어로 공부하다보면 매개변수에 파이프라인 입력 적용 여부 True(ByValue)라는 문구가 있을 것이다.
아래 사진의 경우 -InputObject 라는 매개변수에 ByValue 방식으로 파이프라인에서의 입력을 받는다고 되어있다.
그렇다면 과정은 이렇게 된다.
- 명령어1 | 명령어2(InputObject 매개변수를 가지고 있음)
- 명령어 1이 실행되고, 파이프라인으로 결과값이 넘어옴.
- 명령어 2의 매개변수 중 ByValue 값이 있는 매개변수 탐색하여 해당 매개변수가 존재하면 바인딩.
모든게 이와 같으면 얼마나 좋을까. 보다보면 의문이 생긴다.
명령어 2의 매개변수가 한 개말고 ByValue를 가지고 있는 매개변수가 두 개 이상이면? 어디에 바인딩이 될까?
그럴 땐 매개변수의 형식을 본다.
예를들어 명령어 2의 매개변수1 매개변수2가 있다. (명령어2 -매개변수1[<string>] -매개변수2[<Object>])
매개변수 1은 String 이고 매개변수2는 Object 형식을 받는다.
'Dhcp', 'EFS' | 명령어2
위와 같이 스크립트를 입력하면 매개변수1 과 2중 어디에 바인딩이 될 것인가. .. 당연히 매개변수1에 바인딩이 될 것이다. 형식이 String이기 때문이다. 이렇게 ByValue 형식이 여러 개 일때에는 매개변수의 형식으로 바인딩을 정한다.
ByPropertyName
파워셸에서 ByValue 방식을 사용해 파이프라인 입력을 바인딩 할 수 없으면 ByPropertyName 방식을 시도한다. 이 방식은 앞선 명령의 속성 이름과 이어지는 명령에서 ByPropertyName 으로 파이프라인 입력을 받는 매개변수 중 이름이 일치하는 것이 있으면 바인딩이 수행되는 방식이다.
쉽게 말해서, 명령어1 | 명령어2 라고 하면
- 명령어2에 ByValue 로 받는 매개변수가 없어서 ByValue 실패함
- 명령어 2에 ByPropertyName으로 받는 매개변수가 있는지 탐색
- 명령어2에 ByPropertyName 으로 받는 매개변수 -Name 이 존재함을 확인
- 명령어1의 리턴(개체) 의 속성 이름 중 Name이 있는지 확인
- 명령어 1의 리턴(개체)의 속성 中 Name이 존재한다?
- 바인딩 진행
라는 과정으로 이루어진다.
명령 결과 필터링
개체 필터링은 Select-Object, Where-Object 등이 있지만, Where-Object가 아주 맛있다.
왜냐면 내맘대로 필터링이 가능하기 때문, 직관적으로 표현되기 때문에
걍 예제 몇개 박아놓고 헷갈릴때마다 보러 올 예정.
-FilterScript -> 생략
Where-Object -> ?
$PSItem -> $_
Get-Service H* | ? {$_.Status -eq "Runnung"}
Get-Service M* | ? {$_.Status -eq "Stopped" -or $_.Status -eq "Running"} | Sort-Object -Property Status, Name -Descending
Get-Volume | ? {$_.HealthStatus -ne 'Healthy' -or $_.SizeRemaining -lt 100MB}
이상 1편 끝
'PowerShell' 카테고리의 다른 글
파워셸 디버깅 (0) | 2022.11.20 |
---|