Windows PowerShell자세히 알아보기

Don Jones

Windows PowerShell에는 많은 관리자가 무심코 보아 넘기기 쉬운 많은 기능이 있으므로 자세히 알아보면 놀라운 기능을 찾을 수 있습니다. 사실 Windows PowerShell의 모든 기능을 샅샅이 알고 있다고 생각하던 필자도 특정 cmdlet과 관련된 새로운 기능을 찾아낼 때가 많이 있습니다.

필자가 진행하는 Windows PowerShellTM 강의에서 필자는 시중에서 판매되는 '오늘의 한마디' 달력과 비슷한 '오늘의 cmdlet' 달력을 스스로 만들어 볼 것을 관리자들에게 권합니다. 그리고 매일 아침에(주말은 제외) 몇 분씩만 투자하면 cmdlet의 모든 기능을 익힐 수 있을 것입니다. Windows PowerShell에는 약 130개의 cmdlet이 있으므로 이 일정을 잘 지키기만 하면 6개월 안에 Windows PowerShell의 모든 기능을 익힐 수 있습니다. 그러면 모든 Exchange Server 2007 cmdlet을 사용할 준비가 될 것입니다.

이번 달의 칼럼에서는 몇 분을 투자해 다양한 cmdlet의 기능을 자세히 살펴봄으로써 얻을 수 있는 것과 발견할 수 있는 것을 몇 가지 예를 들어 소개해 보겠습니다.

보기 좋은 HTML 보고서

제대로 활용되지 않고 있는 cmdlet 중 하나가 ConvertTo-HTML입니다. 이 cmdlet은 서비스, 프로세스, WMI(Windows® Management Instrumentation) 개체 등의 입력 개체 컬렉션을 받아서 HTML 표로 바꿀 수 있습니다. 그런 다음 HTML을 Out-File로 파이핑하여 인트라넷 웹 서버에 게시하기에 적합한 HTML 페이지를 생성할 수 있습니다. 예를 들어 매일 아침 다음과 같은 간단한 줄을 실행하도록 예약할 수 있습니다.

Gwmi Win32_Service | Where { $_.StartMode –eq "Auto" –and $_.State –ne "Running" } | ConvertTo-HTML | Out-File C:\ServiceAlert.html

그러면 그림 1과 같이 자동으로 시작되어야 하지만 실행되고 있지 않은 서비스에 대한 HTML 보고서를 만들 수 있습니다.

그림 1 실행되고 있지 않은 서비스에 대한 HTML 보고서

그림 1** 실행되고 있지 않은 서비스에 대한 HTML 보고서 **(더 크게 보려면 이미지를 클릭하십시오.)

물론 더 보기 좋은 보고서를 만들고 싶을 것입니다. 다행스럽게 ConvertTo-HTML cmdlet은 깔끔한 HTML을 생성합니다. 즉, 이 cmdlet에서 생성되는 HTML 코드에는 서식이 포함되지 않습니다. HTML 규칙에 따르면 HTML에 서식을 넣지 않아야 하며 부득이 넣어야 하는 경우에도 최소한으로 넣어야 합니다. 대신 서식은 외부 CSS(Cascading Style Sheet)에 넣고 이 CSS를 HTML에 연결해야 합니다. ConvertTo-HTML을 사용하면 이러한 연결을 만들 수 있습니다.

CSS는 HTML 파일의 <HEAD> 섹션에 연결됩니다. ConvertTo-HTML의 도움말을 보면 간과하기 쉬운 매개 변수가 구문에 들어 있음을 알 수 있습니다.

ConvertTo-Html [[-property] <Object[]>] [-inputObject <psobject>] [-body <string[]>] [-head <string[]>] [-title <string>] [<CommonParameters>]

–head 매개 변수를 사용하면 스크립트의 <HEAD> 섹션에 넣을 HTML 코드를 추가로 지정할 수 있습니다. 이제 한 줄 코드를 수정하여 HTML 표에 적용할 서식이 들어 있는 기존 CSS 파일에 손쉽게 연결할 수 있습니다.

Gwmi Win32_Service | Where { $_.StartMode –eq "Auto" –and $_.State –ne "Running" } | ConvertTo-HTML -title "Services" -head "<link rel='stylesheet' href='styles.css' type='text/ css' />" | Out-File C:\ServiceAlert.html

여기서는 –head 매개 변수를 사용하여 출력 HTML 파일과 같은 폴더에 있는 CSS 파일에 대한 링크를 삽입했습니다. 또한 –title 매개 변수를 사용하여 웹 페이지의 제목을 설정했습니다. 그 결과는 그림 2에서 볼 수 있습니다. 필자가 사용한 Style.CSS 파일의 텍스트는 다음과 같습니다.

그림 2 CSS 파일을 사용하여 서식이 지정된 HTML 보고서

그림 2** CSS 파일을 사용하여 서식이 지정된 HTML 보고서 **(더 크게 보려면 이미지를 클릭하십시오.)

body { background-color:#EEEEEE; } body,table,td,th { font-family:Tahoma; color:Black; Font-Size:10pt } th { font-weight:bold; background-color:#CCCCCC; } td { background-color:white; }

더 쉬운 필터링

이달의 Cmdlet

이번 달에는 cmdlet 쌍인 Start-Transcript와 Stop-Transcript를 살펴보겠습니다. 두 cmdlet은 모두 Windows PowerShell 기록 로깅 기능, 즉 콘솔 창에 표시되는 모든 것을 지정된 텍스트 파일에 기록하는 기능을 제어하는 데 사용됩니다. 사용법은 매우 간단합니다. Start-Transcript를 실행하고 파일 이름을 지정합니다. 그런 다음 Stop-Transcript를 실행하여 기록을 종료하고 파일을 닫습니다. 이는 임시 셸 사용에서 정식 스크립트로 전환할 수 있는 좋은 방법입니다. 각 명령줄이 셸에서 정상 작동하면 미리 만든 기록 파일에서 이를 복사하고 붙여 넣기만 하면 됩니다. 물론 기록을 편집하여 실제 스크립트를 만들 수도 있습니다. 동료 MVP인 Jeffery Hicks의 경우에는 기록을 구문 분석하여 이를 Windows PowerShell PS1 파일로 만드는 스크립트를 작성하기도 했습니다. 이 스크립트는 blog.sapien.com/current/2006/11/28/powershell-transcripts.html에서 볼 수 있습니다.

이제 Get-WMIObject cmdlet을 살펴보겠습니다. Windows PowerShell 기본 제공 도움말에서 나열되는 구문을 보면 잘 활용되지 않는 몇 가지 기능을 발견할 수 있습니다.

Get-WmiObject [-class] <string> [[-property] <string[]>] [-namespace <string>] [-computerName <string[]>] [-filter <string>] [-credential <PSCredential>] [<CommonParameters>]

Windows PowerShell 초보자가 자주 하는 실수 중 하나는 다음과 같은 WMI 명령을 실행하는 것입니다.

Gwmi Win32_NTLogEvent –comp Server2

이 명령은 Server2에서 이벤트 로그 항목(모든 이벤트 로그 항목)을 검색합니다. 이 작업은 Server2가 처리하고 전송하는 데 약간의 시간이 걸리며, 이렇게 큰 컬렉션으로 유용한 작업을 하려면 Windows PowerShell에도 어느 정도의 시간이 필요합니다.

더 좋은 방법은 원하는 이벤트를 Server2가 찾아서 전송하도록 하는 것입니다. WQL(WMI Query Language) 쿼리를 사용하면 이렇게 할 수 있습니다. 쿼리 구문이 까다롭다고 생각하는 사람들도 있지만 Windows PowerShell에서는 –filter 매개 변수를 사용하여 WQL 쿼리의 필터링 부분만 지정하면 됩니다.

Gwmi Win32_NTLogEvent –comp Server2 –filter "EventIdentifier=1024"

이렇게 하면 모든 로그에서 이벤트 ID가 1024인 이벤트를 모두 검색합니다. 필터 조건에서 Windows PowerShell –eq 연산자가 아니라 =를 비교 연산자로 사용한다는 점에 유의하십시오. 필터가 조금 전에 처리를 위해 원격 컴퓨터의 WMI 서비스에 전달되었기 때문에 조건에 Windows PowerShell 구문이 아니라 WMI 구문을 사용해야 합니다.

이것은 실제로 Get-ChildItem과 같은 다른 cmdlet, Dir 및 Ls와 같은 별칭 뒤의 cmdlet에서 사용되는 -filter 매개 변수입니다. 대개의 경우 –filter 매개 변수는 필터 조건을 기반 기술에 직접 전달하기 때문에 소스 필터링이라고 하는 과정이 수행됩니다. 이 과정은 모든 개체를 가져와 Where-Object cmdlet을 통해 실행하여 원하지 않는 것을 필터링하는 것보다 대체로 빠릅니다.

무심코 지나친 Cmdlet

이렇게 하루에 하나씩 cmdlet을 배우는 방법은 이미 알고 있다고 생각한 cmdlet을 좀 더 깊이 있게 이해하는 데 도움이 됩니다. 하지만 하루에 한 cmdlet을 공부해야 하는 다른 이유는 못 보고 지나치기 쉬운 cmdlet을 전체적으로 찾아볼 수 있기 때문입니다. 많은 사람들이 사용하지는 않지만 필자가 즐겨 사용하는 것 중 하나가 Resolve-Path입니다. 와일드카드 경로를 지정하면 이 cmdlet은 경로가 일치하는 파일 및 폴더 이름의 컬렉션을 반환합니다. Get-ChildItem cmdlet(즉, 익숙한 Dir 또는 Ls 별칭)과 비슷하지만 전체 파일과 폴더 개체를 반환하는 것이 아니라 추가적인 필터링이나 처리를 위해 다른 cmdlet에 파이핑할 수 있는 간단한 문자열을 반환합니다. 사용법은 어렵지 않습니다.

Resolve-Path C:\P*

이 간단한 줄을 사용하면 C:\Program Files, C:\Processes.txt 등과 같은 경로가 반환됩니다. 그림 3에서 이 cmdlet을 사용하는 두 가지 예제를 보여 줍니다.

그림 3 무심코 지나치기 쉽지만, 유용한 Resolve-Path cmdlet의 사용

그림 3** 무심코 지나치기 쉽지만, 유용한 Resolve-Path cmdlet의 사용 **(더 크게 보려면 이미지를 클릭하십시오.)

가장 기본적인 것부터 시작하기

cmdlet을 하루에 한 개씩 공부할 준비가 되었으면 Get-Command에 대한 별칭인 Gcm을 실행해 보십시오. 그러면 Exchange Server 2007 Management Shell, PowerShell Community Extensions 등 스냅인을 통해 추가한 것을 포함하여 Windows PowerShell에서 인식하는 모든 cmdlet의 목록을 볼 수 있습니다. 목록에서 첫 번째 항목(필자의 경우에는 Add-Content)을 선택하여 도움말을 읽어 보십시오.

Help Add-Content –full

각 매개 변수의 역할, cmdlet의 사용 예에 대한 완전한 설명을 보고 다른 상세한 정보를 찾으려면 간단한 기본 도움말 대신 전체 도움말을 보면 됩니다. 1-2분 투자하여 cmdlet을 실행해 보십시오. 프로덕션 환경에 영향이 없도록 가상 시스템에서 실행하십시오. 매일 같은 시간에 10분씩 투자하며, 이것을 습관으로 만드는 것이 좋습니다. 그러면 얼마 지나지 않아 Windows PowerShell이 제공하는 모든 기능을 자세히 이해할 수 있게 될 것입니다.

Don Jones는 SAPIEN Technologies의 수석 스크립팅 전문가이자 Windows PowerShell: TFM(SAPIEN Press, 2007)의 공동 저자입니다. 문의 사항이 있으시면 www.ScriptingAnswers.com으로 연락하십시오.

© 2008 Microsoft Corporation 및 CMP Media, LLC. All rights reserved. 이 문서의 전부 또는 일부를 무단으로 복제하는 행위는 금지됩니다..