부동산, 채권, 주식, 경제흐름 자료를 모아 보는 블로그입니다.

파이프로 매개변수 넘겨주기(Power Shell) 본문

Study

파이프로 매개변수 넘겨주기(Power Shell)

runardor 2016. 12. 21. 23:04

컴퓨터 언어를 배울때 정석적이지는 않지만


변수, 배열, 함수, 이런식으로 배웠던 기억이 납니다.



파워쉘에서도 Command들을 파이프로 엮어서 사용하므로 이런 Powershell Command에 매개변수를 어떻게 넣어주어야 할지에 대해 정리하고자 합니다.


간단하게 예제로 볼 내용은 "Get-Process" Command를 이용하여 파이프 매개변수 사용법을 보겠습니다.


그냥.. 혼자 공부하며 정리한 부분이라 모자란 부분이 있을 수 있습니다. ( 사실 리눅스를 많이 안만져봐서 파이프에 약함 ㅠㅠ )




일단 Get-Proccess 명령은 현재 시스템에서 돌아가는 Process에 대해 출력해주게 됩니다.



앞에서 배운 "get-process" command 상세하게 보면 아래와 같습니다.



해당 명령을 보면 파라미터로 name, Id 및 다양한 파라미터를 받고 변수에 저장시 프로세스 객체를 돌려줍니다.



Name을 매개변수로 받으므로 위의 프로세스 화면에서 1개만 떠있는 "asdsvc" 프로세스를 확인해보겠습니다.


사용할 명령어 : "get-process -name asdsvc" or "get-process -Id <Id값>"



해당 명령을 수행하면 Process 이름이 asdsvc인 프로세스에 대해 출력을 해주게 됩니다.



이제 여기서 부터 본격적으로 파이프로 매개변수를 넘겨보겠습니다.


사용할 명령어 : "get-process -name asdsvc | select Id" 


해당 명령어는 asdsvc로 검색되는 프로세스를 Input으로 하여 select 에 넘기며 넘어온 DATA중 Id값만 뽑으라는 명령입니다.



여기에 추가적인 파이프를 이어서 해당값을 "get-process" 명령으로 연결해서 실행하면 어떻게 될까요??


사용할 명령어 : "get-process -name asdsvc | select Id | get-process"


결론적으로 말하면 실행이 매우 잘됩니다.




그러면 여기서 또 질문!! Id값이 아닌 Handles값을 이용하면 어떻게 될까요??


사용할 명령어 : "get-process -name asdsvc | select Handles | get-proecss"



매개변수 에러로 실행이 안됩니다.


왜 에러가 나는걸까요??? 어쩌면 당연한거일지도 모르지면 "get-processs" 명령어의 상세 정보를 보면 매개변수로 Id는 사용할수 있지만 handles는 사용할 수 없기 때문에 당연하게도 매개변수 에러가 납니다.



여기서 파이프에 대한 지식이 없었기 때문에 추가적인 궁금증이 들었습니다 get-process 명령은 Id를 매개변수로 받는데 파이프로 넘겨줄때 


그럼 어떻게 Id인지 알아서 넘기는걸까??


파워쉘 Command에 의해 반환되는 DATA는 단순한 String이 아니라 DATA 집합 ( 튜플과 유사) 입니다.


파이프 Input으로 객체를 넘겨주면 Command 내부에서 Input으로 들어갈수 있는 Data가 있는지 확인해서 실행해줍니다.


이때 객체에 존재하는 Name과 파라미터의 인자가 동일해야합니다.


간단하게 아래의 명령을 쳐서 확인해봅니다.


$a = get-process -name <프로세스 명> | select Handles

$a.GetType()



출력 데이터


PS C:\Users\> $a = get-process WINWORD | select Handles

PS C:\Users\> $a.GetType()


IsPublic IsSerial Name                                     BaseType

-------- -------- ----                                     --------

True     False    PSCustomObject                           System.Object


WINWORD 프로세스의 핸들값을 뽑아서 변수 a에 넣고 해당 a값의 타입을 출력한 부분입니다.


Name을 보시면 String이나 Value가 아닌 PSCustomObject임을 알 수 있습니다.


해당 값은 프로세스에 의해 임의로 만들어진 객체를 나타냅니다. 


왜 임의의 객체일까요?? select 할때 어떤 값들이 조합될지 모르기 때문에 정형화된 객체가 아니기 때문입니다.


파이프로 매개변수를 넘겨받아 Command를 실행할때는 Noun이 대부분 같은 녀석들이 Input으로 넘어가기 때문에 


Out으로 나오는 녀석들을 가공하지 않는 이상 크게 신경쓰지 않아도 됩니다. 하지만 Out으로 나오는 녀석들을 가공해서 파이프의 In으로 넣을떄는


위의 내용을 확인하고 넣어주면 깔끔하게 실행됩니다.


감사합니다.



'Study' 카테고리의 다른 글

Process BaseAddress 구하기  (0) 2017.06.02
Command 실행시 매개변수 잘 써보자! (Power shell)  (0) 2016.12.21
Cmdlet(Power Shell)  (0) 2016.12.21
WMI (Windows Management Instrumentation)  (0) 2016.08.22
PowerShell을 이용한 다운로더  (0) 2016.08.22
Comments