제공 :
한빛 네트워크
저자 : Doug Finke
역자 : 문현진
원문 :
PowerShell Command Line Introduction
여기 잘 작성한 한 줄 짜리 파워쉘 3.0 이 있습니다. 블로그에서 RSS Feed를 제목과 발행일만 표시해서 받아보려면 아래의 코드를 실행 해보세요:
Invoke-RestMethod "http://www.dougfinke.com/blog/index.php/feed/" | Select title, pubdate
보시다 시피 간단 합니다. 루프도 없고, 스트림의 마지막에 대한 체크도 없습니다. RSS 피드를 XML 형태로 변경하기 위한 XSLT도 없습니다. 잠시만요. 이것이 전부가 아닙니다. 이 객체 배열은 이제 전체 파워쉘 환경에 연결되었습니다. 파워쉘은 .NET에 기반을 두고 있어서, 사용자는 ADO.NET을 사용해서 위에서 얻은 데이터를 데이터베이스에 삽입(Insert) 하고, Invoke-RestMethod를 다시 사용해서 또 다른 REST endpoint로 전송하거나, Microsoft Excel로 보낸서 COM API로 조작 할 수 있습니다. 자 여러분, 이제 파워쉘의 바다로 뛰어들 준비가 끝났습니다.
파워쉘은 커맨드 라인 쉘, 통합 스크립팅 환경(ISE), .NET 프레임워크에 기반한 스크립트 언어, 파워쉘을 .NET 응용 프로그램에서 호스트 할 수 있게 해주는 API를 포함하는 마이크로소프트의 작업 자동화 프레임워크이자 분산 자동화 플랫폼입니다. 즉, 다른 컴퓨터에서 동작하는 파워쉘을 가지고 있다면, 원격으로 파워쉘을 다른 컴퓨터에서 실행할 수 있습니다. 단, 자격증명(Credential)을 가진 경우에 말이죠.
시작하기
이제 파워쉘 콘솔을 실행할 필요가 있습니다. 제가 가진 Windows 8 장비에서 저는 Windows 버튼을 누르고, "powers"를 입력하고 엔터키를 입력했습니다.
잘했습니다! 이제 텅 빈 블루 스크린이 나타났습니다. 이제 뭘 해야 될까요?
파워쉘의 Cmdlets를 반드시 알아야 합니다
Cmdlets (또는 고급 함수들)은 파워쉘을 기초 구성 요소이고, 동사 "-"(하이픈) 명사의 형태를 갖추고 있습니다. 예를 들어 화면에 텍스트 파일의 내용을 표시하려면, 이렇게 하면 됩니다:
Get-Content c: est.txt
Get-Content는 파워쉘 cmdlet 입니다.
Get은 동사, 그리고 나서 "-" (하이픈), 동사에 뒤따라서
Content가 옵니다.
이것이 파워쉘 cmdlet의 형태입니다. 파워쉘을 사용해서 작업을 더 해보면, 명령어들을 타이핑(그리고 나중에는 이 명령어들을 만드는 것)하는 일들이 본능처럼 느껴질 것입니다.
그러면 우리의 빈 석판에서, 어떻게 무엇을 해야 할지 발견 할 수 있을까요? 파워쉘의 기둥이 되는 핵심 기능 중 하나는 발견가능성(discoverability) 입니다. 그래서 여기 첫 번째로 반드시 알아야 하는 파워쉘 cmdlets이 있습니다. 준비 됐나요? 그 파워쉘 cmdlets는 verb-noun 형식입니다.
Get-Command입니다.
Get-Command
Get-Command cmdlet은 현재 파워쉘 세션에서 사용자가 작업 할 때 사용 할 수 있는 모든 것들을 표시 합니다. 윈도우 2012 Server에서 PowerShell 콘솔에
Get-Command을 실행하면, 2400개 이상의 cmdlet 목록을 볼 수 있습니다. 많은 cmdlet이 지원하는 Get-Command의 한 가지 특성은 와일드카드(*, wild cards)를 사용 할 수 있는 점입니다. 그래서
Invoke 동사로 시작 하는 모든 것들을 찾을 수도 있습니다.
이것은 명령어의 타입, cmdlet의 이름 그리고 속해 있는 모듈을 표시합니다. 아직까지 잘 따라오면서 타이핑하고 있다면, 사용자가 사용할 수 있는 명사로 끝나는 항목들은 어떻게 찾을수 있을까요?
Get-Help
좋습니다. 원하는 것을 찾는데
Get-Command를 사용했습니다. 또 어떻게 해야 할까요? 글쎄요, 도움을 요청하십시오.
Get-Help cmdlet는 바로 그런 기능입니다. 이제
Get-Content를 해봅시다.
전달할 수 있는 매개변수들과 간단한 설명을 볼 수 있습니다. Get-Content (또는 시스템에 있는 다른 cmdlet)의 사용 예제를 보려면,
-Examples 매개변수를 사용하십시오.
파워쉘에는 배열이 있습니다
PowerShell에는 배열이 있고, 어떻게 출력 하는지 알고 있습니다. 즉, for 루프가 필요 없습니다. 변수를 타이핑하고 엔터키를 누르면 파워쉘이 내용을 보여줄 것입니다. 사용자는 빈 배열 또는 이미 채워진 배열을 생성할 수 있습니다. 1 .. 10은 범위 연산자를 보여줍니다. 파워쉘은 .NET에 기반하고 있습니다. 이 말은 변수에 대해서 더 많은 정보를 얻기 위해
GetType() 메소드를 사용 할 수 있다는 것을 의미 합니다.
파워쉘에는 해쉬 테이블이 있습니다
파워쉘은 해쉬 테이블도 가지고 있습니다. 비어 있는 해쉬 테이블을 만들거나 초기화 할 수 있습니다. 해쉬 테이블을 출력 할 때, 파워쉘은 해쉬 테이블을 인식하고, 이름/값 형태의 제목으로 잘 정렬해서 표시합니다.
덧붙이자면, 파워쉘은 해쉬 테이블의 원소에 접근하기 위해서 점 표기법(dot notation)을 지원합니다. 사용자는 C# 에서도 이런식으로 해야 할 것 입니다. 파워쉘은 아래와 같은 방법도 지원하지만, 저는 타이핑을 적게 하는 쪽을 선호 합니다.
$hash["c"]
C#에서 중첩된 해시 테이블에 접근 하는 것은 더 수고롭습니다. 사용자는 반드시 캐스트 하고 나서야, 키/값 쌍에 접근 할 수 있습니다.
파워쉘은 XML 파일을 읽고, 변환 하고 출력 할 수 있습니다
여기 XML 파일이 있습니다.
단 한 줄의 코드에서 많은 일들이 벌어지고 있습니다. 첫번 째,
Get-Content cmdlet을 사용해서, products.xml을 읽어들입니다.
[XML]에 주목하십시오. 이것은 파워쉘 가속기입니다. 이 가속기는 XML을 받고 XmlDocument를 인스턴스화합니다. 올바른 형태가 아니면, 오류를 발생시킵니다. 거기서 부터, 우리는 점 표기법(우리가 해쉬 테이블에서 한것 처럼)을 루트에서 부터 요소, 속성에 이르기까지 사용 할 수 있습니다. .Products.Product 를 보셨나요? 이는 Products의 배열을 나열하고 정의된 모든 속성을 표시해줍니다.
파워쉘은 객체 지향 스크립트 언어입니다
Get-Process 시스템에서 동작하고 있는 프로세스들을 반환하는 또 다른 내장 cmdlet 입니다. 어떤 프로세스가 700개 이상의 핸들을 점유하고 장비에서 동작 하고 있는가? 같은 질문에 대답 합니다. 덧붙이자면, 저는 가장 많은 메모리를 사용 하고 있는 프로세스를 보고 싶습니다.
Get-Process는 파이프라인을 통해서 장치에서 동작하는 각각의 프로세스에 System.Diagnostics.Process 객체를 밀어 넣습니다. System.Diagnostics.Process 객체는
Handle 속성을 가집니다.
Where cmdlet은 그 속성들의 값이 700이 넘는지 확인 합니다. 넘지 않으면 무시합니다. 반대의 경우에는 파이프 라인의 다음으로 밀어냅니다.
Sort cmdlet은 일치하는 모든 레코드를 얻어서,
PM 속성에 따라 내림 차순으로 정렬 합니다.
값이 숫자 또는 글자 인지를 확인하거나, 변수로 변환 하기 위해서 "긁어내지(Scrape)" 않아도 됩니다. 파워쉘은 속성들이나, 메소드들 그리고 이벤트들로 객체에 직접 작업 합니다. 가장 좋은 소식은 우리가 출력을 긁어내는 경우에는 다른 누가가 와서 컬럼을 바꾸거나 스페이스나 탭을 넣어서 데이터를 망가뜨릴 여지가 있다는 것입니다. 객체들은 하루를 절약 합니다.
파워쉘은 함수와 Array Comprehensions을 가집니다
파워쉘에서 함수를 만드는 것은 엄청 쉽습니다. 함수, 이름, 매개 변수(원하는 경우에) 그리고 중괄호 사이에 코드를 몇 줄 넣는 것이 전부 입니다.
이 예제는 square와 cube 두개의 함수를 생성합니다. 두 개 모두 하나의 매개변수인
$x를 가집니다.
square 함수는 매개변수 자체를 두 배 합니다.
cube 함수는 square 함수를 호출하고, 그 결과 값을 입력받은 매개변수로 곱셈 합니다.
예제의 마지막 부분에서
$list 배열을 받아서 파워쉘의
ForEach에 파이프로 연결하고 전달 받은 개별 항목마다
cube 함수를 실행 합니다.
$_은 파이프 라인의 현재 항목을 담고 있는 자동 변수 입니다.
파워쉘은 아주 완벽하게 .NET Framework를 사용합니다
앞의 예제는
cube 함수를 가지고 있었습니다. 사용자는 더욱 쉽고 직접적으로 .NET 프레임워크에 대신 접근 했습니다. System.Math 네임스페이스에 익숙 하시나요? 다음은 파워쉘에서 정적 메소드인
Pow에 어떻게 접근 하는지 보여줄 것입니다.
Pow는 명시한 만큼 거듭제곱 한 값을 반환 합니다.
메소드가 정적이라는 것을 나타내기 위해서는 네임스페이스 주위에 괄호와 :: (이중 콜론)을 사용 할 필요가 있습니다. 문법은 약간 다르지만, 자꾸 사용하다보면 익숙해 질 것입니다.
파워쉘은 C#을 메모리 상에서 바로 컴파일 하고 실행 할 수 있습니다
Add-Type cmdlet을 사용하면 C#을 바로 컴파일 할 수 있습니다. 이 기능은 사용하려는 C# 코드를 가지고 있지만 DLL을 복사 하고 싶지 않거나, 파워쉘의 한계에 부딪혔을때(자주 일어나는 일은 아닙니다) 사용자는 아주 완벽하게 고성능 해결책을 인라인으로 추가 할 수 있다는 점에서 굉장 합니다.
간단한 예제가 있습니다.
MyClass라는 이름의 클래스가 있고, 하나의 메소드
Add가 있습니다. "@ 뒤에서 엔터를 누르기만 하면, C# 코드 조각은 컴파일되고, 파워쉘 세션에서 사용 할 수 있게 됩니다.
New-Object cmdlet은 MyClass를 할당 합니다. 그 다음에 우리는 Add 메소드를 호출 할 수 있습니다. 이제 파워쉘의 어디서나 이 함수를 사용 할 수 있습니다. ForEach 코드조각을 참고 하십시오.
파워쉘은 주식 시세 웹 서비스와 상호작용 합니다
다음은 종목 기호에 대한 주식 시세를 반환하는 무료 웹 서비스입니다.
New-WebServiceProxy cmdlet을 사용하면 이것을 스냅사진 처럼 만들 수 있습니다. url과
New-WebServiceProxy를 입력하면 WSDL을 읽고 객체를 생성해서 사용 할 수 있는 상태로 만듭니다. 이 서비스는 XML을 반환 하므로, [xml] 가속기를 사용 합니다. 그리고 나서 얻어온 주식 시세 데이터에 점 표기법을 사용 합니다.
요약
파워쉘은 저력이 있고, 마이크로소프트로부터 한결 같이 중요한 투자를 받고 있습니다. 서버 제품이 파워쉘 인터페이스를 가지고 있지 않는다면, 그 제품은 팔리지 않습니다. 델, 시스코, 인텔, 아마존을 포함하는 많은 서드파티들이 자신들의 제품과 파워쉘을 같이 사용 할 수 있도록 하는 컴포넌트들을 판매하고 있습니다.
무엇을 만들겠습니까?