Windows PowerShell데이터 필터링 및 서식 지정

Don Jones

Windows PowerShell이 많은 사용자 작업 없이도 대량의 유용한 정보를 반환할 수 있다는 데는 의문의 여지가 없습니다. 예를 들어 로컬 컴퓨터의 서비스 목록을 반환하는 데 사용할 수 있는 간단한 Get-WMIObject cmdlet 명령을 살펴보겠습니다. 기본 보기에는 실행 중인 서비스의 상태, 이름 및 시작 모드가 나열됩니다.

이 보기는 본질적으로 서비스 콘솔의 명령줄 보기인데, Windows PowerShell™을 사용하면 이 보기를 훨씬 쉽게 표시할 수 있습니다.

또한 서비스에 사용할 수 있는 유용한 정보를 기본 보기에서보다 더 많이 포함할 수 있습니다. 이제 이 명령을 실행해 보겠습니다.

$s = get-wmiobject win32_service
$s[0] | gm

첫 번째 명령줄은 모든 서비스의 모음, 즉 Windows® Management Instrumentation(WMI)의 Win32_Service 클래스에 대한 모든 인스턴스를 반환하고 이를 $s 변수에 저장합니다. 두 번째 줄은 해당 모음의 첫 번째 서비스(대괄호로 표시된 서수 0)를 가져와서 이를 Get-Mem­ber cmdlet(gm이라는 별칭으로 줄여 씀)에 전달합니다. 그 결과로 해당 데이터 형식에 사용할 수 있는 속성과 메서드가 모두 표시됩니다. 필자는 Win­dows PowerShell의 기본 제공 Get-Service cmdlet 대신 WMI의 Win32_Service 클래스를 사용하기로 했는데, WMI가 Start­Name 속성을 비롯하여 실제로 Microsoft® .NET Service­Controller 개체보다 더 많은 정보를 보여 주기 때문입니다. 이 속성은 서비스가 실행 중인 사용자 계정의 이름을 알려 줍니다. 다음과 같이 단일 인스턴스(예: 첫 번째 인스턴스)의 이름을 확인할 수 있습니다.

PS C:\> $s[0].StartName
LocalSystem

그러나 서비스는 특정 순서로 되어 있지 않으므로 모음 내에서 서수로 서비스를 참조하는 것은 그리 유용하지 않습니다 참고로, 서비스는 거의 대부분 사전순으로 나열됩니다. 관리 관점에서 봤을 때 사용자가 가장 관심을 갖는 항목은 모든 서비스 목록 및 각 서비스가 로그인에 사용하는 계정입니다. 이러한 항목은 준수성 감사 등에 유용합니다. 따라서 잠시 WMI에서 기본적으로 제공하는 사항에 대해 알아보겠습니다. 이를 위해 Get-WMIObject의 단축 별칭인 gwmi를 사용할 것입니다(그림 1 참조).

Figure 1 gwmi 사용

PS C:\> gwmi win32_service

ExitCode  : 0
Name      : AcrSch2Svc
ProcessId : 1712
StartMode : Auto
State     : Running
Status    : OK

ExitCode  : 1077
Name      : Adobe LM Service
ProcessId : 0
StartMode : Manual
State     : Stopped
Status    : OK

이것은 간단한 샘플이지만 그 결과가 관리 보고용으로 그리 만족스럽지 않다는 것을 알 수 있습니다. 필자가 원하는 것은 서비스의 이름과 서비스가 실행 중인 계정인 Start­Name입니다. 또한 알아 보기 힘든 목록보다는 보기 좋은 형식의 보고서를 원합니다. 따라서 여기에서 Windows PowerShell의 뛰어난 서식 및 데이터 필터링 명령인 cmdlet가 사용됩니다.

필요한 데이터 가져오기

먼저 관심 있는 속성이 표시될 수 있도록 Get-WMIObject의 데이터를 필터링해 보겠습니다. 가장 좋은 방법은 Windows PowerShell Select-Object cmdlet 또는 간단한 별칭인 select를 사용하는 것입니다. select는 Get-WMIObject에서 반환하는 모음과 같은 개체 모음을 받아들여 이러한 개체의 원하는 속성만 표시하기 위해 설계되었습니다. 다시 말해 gwmi의 출력을 select에 전달하여 원하는 두 개의 속성을 지정할 수 있습니다. 그림 2는 표로 서식이 지정된 Name 및 StartName 속성이 포함된 결과를 보여 줍니다.

그림 2 Name 및 StartName 속성을 표 형식으로 보기

그림 2** Name 및 StartName 속성을 표 형식으로 보기 **(더 크게 보려면 이미지를 클릭하십시오.)

그러나 준수성 감사를 위해 이러한 보고서를 생성한 경우에는 보고서에 포함된 정보가 너무 많습니다. 일부 서비스는 비활성화되어 있으므로 출력을 읽는 사용자에게 비활성화된 서비스가 이론적으로 어떤 계정을 사용하는지는 중요하지 않을 것입니다. 따라서 시작 유형, 즉 Win32_Service 클래스의 StartMode 속성이 Disabled인 모든 서비스를 필터링하여 제외하려고 합니다.

Windows PowerShell은 Where-Object cmdlet 또는 간단한 별칭인 where를 사용하여 개체 필터링을 수행합니다. where cmdlet 명령은 입력 개체 모음을 받아들인 다음 스크립트 블록에서 각각을 실행하여 정의된 일련의 조건에 따라 각 개체를 cmdlet의 출력에 표시해야 하는지 여부를 확인합니다. 조건을 충족하는 각 개체는 True 값을 생성하고 출력에 포함됩니다. False 값을 생성하는 개체는 포함되지 않습니다.

따라서 필자는 StartMode 속성이 Disabled인 개체만 출력하기로 결정했습니다. Windows PowerShell 구문에서 평가식은 다음과 같습니다.

$object.StartMode –eq “Disabled”

물론 $object는 단지 예에 불과합니다. 실제로 스크립트를 작성하고 있는 것이 아니므로 $object라는 변수는 사용하고 있지 않습니다. 그러나 where에서 사용되는 스크립트 블록 내에서는 cmdlet에 의해 현재 평가되고 있는 개체를 나타내는 $_이라는 특수 변수를 사용했습니다. 따라서 where 스크립트 블록은 다음과 같습니다.

$_.StartMode –eq “Disabled”

다음과 같이 테스트할 수 있습니다.

PS C:\> gwmi win32_service | where 
{$_.StartMode -eq “Disabled”}

ExitCode  : 1077
Name      : Alerter
ProcessId : 0
StartMode : Disabled
State     : Stopped
Status    : OK

물론 이 간단한 테스트에서 출력은 기본 목록 스타일로 표시됩니다. 그리고 공간 절약을 위해 한 개의 서비스만 포함했습니다. 그런데 이 출력이 원하는 결과와 반대임을 알 수 있습니다. 여기에서는 비활성화된 서비스가 제외되지 않고 포함되어 있는데, 이는 스크립트 블록을 반대로 작성했기 때문입니다. 실제로는 다음 예제에서 수정된 것과 같이 StartMode가 Disabled가 아닌 모든 서비스를 포함해야 합니다.

PS C:\> gwmi win32_service | where 
{$_.StartMode -ne “Disabled”}

ExitCode  : 0
Name      : AcrSch2Svc
ProcessId : 1712
StartMode : Auto
State     : Running
Status    : OK

이제 원하는 결과가 나왔습니다. 출력에 정말 필요한 서비스만 포함되어 있으므로 다시 한 번 출력을 select에 전달하여 원하는 속성만 지정할 수 있습니다.

gwmi win32_service | where {$_.StartMode -ne “Disabled”} | select name,startname

데이터를 한 cmdlet에서 다른 cmdlet로 전달하는 과정은 Windows PowerShell의 기능을 정말 잘 보여 줍니다. 아직 스크립트가 완성되지는 않았지만 찾고 있는 출력만 가져오도록 큰 데이터 집합을 필터링했습니다.

보기 좋은 모양

select의 출력은 여전히 일련의 개체라는 점에 주의를 기울어야 합니다. Windows PowerShell을 사용하여 보기 좋게 서식이 지정된 테이블을 가져올 경우 표시되는 개체는 PowerShell.exe를 통해 렌더링된 것입니다. 즉, Windows PowerShell은 사람의 눈에는 개체가 보이지 않다는 것을 인식하고 개체를 텍스트로 렌더링합니다. 이 경우 그림 2와 같이 개체가 각 속성에 대한 열을 포함하는 테이블로 렌더링됩니다.

이제 정보를 감사용으로 사용하기에 충분해 보입니다. 그러나 한편으로는 충분하지 않을 수도 있습니다. 모든 사람의 요구 사항은 각기 다르므로 Windows PowerShell은 사용자의 구체적인 요구 사항을 알 수는 없지만, 대신 출력 서식을 각 사용자에게 가장 적합한 방식으로 지정할 수 있는 도구를 제공합니다. 네 개의 기본 cmdlet인 Format-List, Format-Custom, Format-Table, Format-Wide는 개체 모음(예: select에 의해 반환된 모음)을 받아들인 다음 해당 개체의 서식을 다양한 방식으로 지정하기 위해 설계되었습니다. Format-Table은 Windows PowerShell에서 기본적으로 필자가 사용한 select cmdlet의 출력 서식을 지정하는 데 이미 사용되고 있는 방식입니다. 다른 모양을 원하면 Format-List를 사용해 보십시오.

gwmi win32_service | where {$_.StartMode -ne “Disabled”} | 
select name,startname | format-list

그 결과는 다음 샘플과 유사합니다.

name      : AcrSch2Svc
startname : LocalSystem

name      : Adobe LM Service
startname : LocalSystem

Format-Wide cmdlet는 기본적으로 각 개체의 첫 번째 속성을 여러 열로 된 목록으로 생성하기 위해 설계되었습니다. 다음 예를 살펴보겠습니다.

gwmi win32_service | where {$_.StartMode -ne “Disabled”} |
 select name,startname | format-wide

이 예에서는 서비스 이름 목록이 생성되는데, 이것은 필자가 원하는 정보가 아닙니다. 이 출력에는 감사 보고서에 필요한 중요한 정보인 StartName(그림 3 참조)이 누락되어 있습니다.

그림 3 Format-Wide cmdlet를 사용하여 표시된 출력에 중요 정보인 StartName이 누락됨

그림 3** Format-Wide cmdlet를 사용하여 표시된 출력에 중요 정보인 StartName이 누락됨 **(더 크게 보려면 이미지를 클릭하십시오.)

필자는 두 가지 속성만 다룰 것이므로 Format-Table 또는 Format-List가 적합합니다. 그런데 감사자가 이 정보를 화면에서 보는 것을 좋아하지 않을 수 있습니다. 이 정보를 파일로 출력하기를 원할 수 있습니다.

데이터 내보내기

그렇다면 감사자는 데이터를 어떤 방식으로 보기를 원할까요? 서비스 및 로그인 이름 목록을 CSV(쉼표로 구분된 값) 파일로 출력하면 Microsoft Excel®에서 쉽게 열 수 있으므로 이 파일을 사용하는 것이 좋습니다. CSV 파일을 만들려면 출력을 Windows PowerShell Export-CSV cmdlet로 전달하기만 하면 됩니다.

gwmi win32_service | where {$_.StartMode -ne “Disabled”} | 
select name,startname | export-csv c:\services.csv

그러나 요즘에는 CSV가 다소 구식이 된 것 같습니다. 감사자는 데이터가 인트라넷 서버에서 웹 페이지로 표시되는 것을 선호할 수 있습니다. 이를 위해 먼저 다음과 같이 ConvertTo-HTML cmdlet를 사용하여 출력을 HTML로 변환하겠습니다.

gwmi win32_service | where {$_.StartMode -ne “Disabled”} | 
select name,startname | convertto-html

원시 HTML은 보기 힘들 수 있으므로 출력을 파일에 써야 합니다.

gwmi win32_service | where {$_.StartMode -ne “Disabled”} | 
select name,startname | convertto-html | out-file c:\services.html

그림 4와 같이 보기 좋게 서식이 지정된 HTML 페이지가 만들어지며, 이 페이지는 추가 수정 없이도 모든 웹 서버에 게시할 수 있습니다.

그림 4 보기 좋게 서식이 지정된 HTML 페이지로 표시된 출력

그림 4** 보기 좋게 서식이 지정된 HTML 페이지로 표시된 출력 **(더 크게 보려면 이미지를 클릭하십시오.)

요약

Windows PowerShell은 다양한 범위의 관리 데이터에 빠르게 액세스할 수 있도록 합니다. 그러나 원시 상태의 이 데이터가 늘 비즈니스에서 유용한 것은 아닙니다.

where를 통해 데이터를 필터링하고 select로 원하는 개체 속성을 선택한 다음 Format-Table이나 Format-List 등의 적절한 서식 지정 옵션을 적용하면 이러한 관리 데이터를 간단하고 빠르게 유용한 정보로 바꿀 수 있습니다. 그런 다음 쉽게 공유할 수 있는 파일 형식으로 데이터를 내보내면 자신의 컴퓨터에 있던 가치 있는 정보를 회사의 다른 사람들에게 전달할 수 있습니다.

Don Jones는 SAPIEN Technologies의 프로젝트 및 서비스 담당 이사이자 Windows PowerShell: TFM(SAPIEN Press)의 공동 저자입니다. 문의 사항이 있으면 www.ScriptingAnswers.com으로 연락하시면 됩니다.

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