Windows PowerShell스크립트가 필요 없는 작업

Don Jones

회의, 공개 Windows PowerShell 뉴스 그룹 또는 필자의 사이트 등에서 Windows PowerShell에 대해 이야기할 때면 항상 Windows PowerShell을 곧 "배우려고 한다"는 관리자를 만나게 됩니다. 이유가 무엇일까요? 가장 흔한 이유는

"지금은 스크립트 방법을 배울 시간이 없기 때문"이라고 합니다.

공감이 가는 얘기입니다. 관리자는 바쁜 직업이며 새 기술을 배울 시간이 부족한 것이 사실입니다. 하지만 관리자는 관리자 작업에 중요한 기술의 발전을 따라잡기 위해 Windows Vista®, Windows Server® 2008 및 Exchange Server 2007과 같은 새 소프트웨어를 배워 항상 앞서 나가도록 노력해야 합니다. Windows PowerShell™은 이러한 기술의 큰 부분 중 하나입니다.

관리자들이 Windows PowerShell의 스크립트 배우기를 미루는 다른 이유는 "프로그래머가 되는 것에 대한 두려움" 때문입니다. 이 이유라면 필자가 도움을 드릴 수 있습니다. 약간의 코드도 작성하지 않고 Windows PowerShell을 사용하여 할 수 있는 일이 얼마나 강력한지 알게 되면 놀랄 것입니다.

파이프라인 준비

필자는 이전에 Windows PowerShell에서 사용되는 매우 유연하며 강력한 개체 지향적 파이프라인에 대해 설명한 적이 있습니다. "개체 지향적"이라는 단어 때문에 프로그래밍 분야로 들어가는 것이 아닌지 의심할 수 있겠지만 제 얘기를 계속 들어 보십시오. 파이프라인의 장점 중 하나는 대화식으로 사용할 수 있다는 점입니다. 즉각적인 결과를 제공하며 이 결과를 손쉽게 조정할 수 있기 때문에 원하는 것을 정확하게 얻을 수 있습니다. 예를 들어 몇몇 원격 컴퓨터의 빈 디스크 공간 인벤토리가 필요한 경우를 가정해 보겠습니다. 이러한 컴퓨터의 이름은 C:\Computers.txt라는 텍스트 파일에 나열되어 있습니다. 이 파일은 데이터베이스처럼 복잡한 것이 아니라 한 줄에 하나의 컴퓨터가 기록된 일반 텍스트 파일입니다.

우선 로컬 컴퓨터에서 이 정보를 검색할 수 있는지 알아봅니다. 한 컴퓨터에서 이 정보를 검색할 수 있다면 여러 컴퓨터에서 작업을 수행하는 것도 그다지 어렵지 않을 것입니다. 다시 말하지만 여기에는 스크립팅 작업이 필요 없습니다. 필자는 모든 작업을 셸에서 Enter 키를 누르면 곧바로 결과가 표시되는 대화식으로 작업할 것입니다.

이러한 유형의 작업에 대해 약간의 힌트를 드리자면 원격 컴퓨터에서 관리 정보를 관리하는 경우 대개 WMI(Windows® Management Instrumentation)를 사용합니다. 이제 이 예의 목적상 WMI를 사용해야 한다는 점 이외에는 아무것도 모른다고 가정하겠습니다. 따라서 Live Search로 이동하여 "windows wmi free disk space"를 검색어로 입력합니다. 발췌문에 "Win32_LogicalDisk"라는 문구가 나열된 몇몇 검색 결과가 표시됩니다. 이것은 WMI 클래스로 보이므로 이들 검색 결과를 클릭하여 확인해 보는 대신 "Win32_LogicalDisk"를 새 검색어로 입력합니다. 그러면 MSDN® 사이트의 Win32_LogicalDisk 문서 페이지(msdn2.microsoft.com/aa394173.aspx)가 결과 맨 위에 표시됩니다. 이 페이지로 이동하여 살펴보면 이 클래스의 속성 중 하나가 우리가 찾는 FreeSpace임을 알 수 있습니다.

Cmdlet 찾기

다음 단계로는 WMI 클래스의 속성을 검색할 cmdlet을 찾아야 합니다. Windows PowerShell의 주목할 만한 특징 중 하나는 멋진 자체 검색 기능을 기본적으로 갖추고 있다는 점입니다. 즉, 셸을 통해 자체 기능을 찾아낼 수 있습니다. 따라서 WMI 사용에 대한 셸 도움말을 보기 위해 Help *wmi*를 입력합니다. 그 결과(그림 1) Gwmi 별칭과 이것이 가리키는 cmdlet인 Get-WMIObject가 표시됩니다. 기본적으로 같은 기능에 두 가지 방법으로 액세스할 수 있는데 어떤 방법을 사용해도 무방합니다. 두 가지 모두 같은 작업을 수행하며 Gwmi가 입력하기가 더 간단하므로 이것을 사용하겠습니다.

그림 1 WMI 사용에 대한 셸 도움말

그림 1** WMI 사용에 대한 셸 도움말 **(더 크게 보려면 이미지를 클릭하십시오.)

PS C:\> gwmi win32_logicaldisk

관리자에게는 Shift 키를 누르는 시간도 아깝다는 것을 알고 있는 듯이 Windows PowerShell은 대/소문자를 구분하지 않습니다.

그림 2에 나와 있는 것처럼 이 명령의 결과에는 모두 다섯 개의 로컬 드라이브와 각 드라이브의 FreeSpace 속성(바이트 단위)이 표시됩니다. 또한 이들 드라이브 중 각각에 대한 DriveType 속성도 나열되며 필자의 컴퓨터에서는 2, 3 및 5 값이 표시됩니다.

그림 2 모든 로컬 드라이브와 각 드라이브의 FreeSpace 속성

그림 2** 모든 로컬 드라이브와 각 드라이브의 FreeSpace 속성 **(더 크게 보려면 이미지를 클릭하십시오.)

이달의 Cmdlet

Get-Content를 사용하여 텍스트 파일의 내용을 읽어본 적이 있을 것입니다. 이 도구는 파일의 각 줄을 [문자열] 개체로 취급하며 해당 개체를 다른 cmdlet이 다룰 수 있도록 파이프라인으로 전달합니다. 하지만 Get-Content에는 이외에도 여러 옵션이 있으므로 유연하게 사용할 수 있습니다. 예를 들어 readCount 매개 변수를 사용하여 한 번에 파이프라인에 전달되는 [문자열] 개체의 수를 지정할 수 있습니다. 또한 totalCount 매개 변수를 통해 파일에서 읽어 오는 총 줄 수를 제어할 수도 있습니다. 이 두 가지 매개 변수 모두 성능 이유로 인해 한 번에 전체 파일을 처리하지 않는 것이 좋은 매우 큰 파일을 다룰 때 유용합니다.

다른 편리한 매개 변수로는 encoding 매개 변수가 있는데, 이를 사용하면 유니코드, ASCII, UTF7, UTF8 등을 포함하여 다양한 파일 인코딩 형식을 올바르게 읽을 수 있습니다. 지원되는 인코딩 형식의 전체 목록을 보려면 help gc(gc는 Get-Content의 별칭)를 실행하십시오.

데이터 구체화

이 단계에서는 두 가지 문제가 있습니다. 첫 번째로 여기에서는 FreeSpace 이외의 다른 속성은 필요 없습니다. 두 번째로 광 드라이브, 이동식 드라이브 또는 네트워크 드라이브의 빈 공간은 알 필요가 없으며 로컬 하드 디스크만 알면 됩니다. DriveType 속성을 사용하면 이를 구분하는 데 도움이 될 수 있습니다. 다시 웹 브라우저로 돌아가서 각 DriveType 값이 나타내는 드라이브를 설명하는 표가 있는 문서를 확인합니다. 드라이브가 로컬 하드 디스크임을 나타내는 DriveType이 3인 드라이브만 필요합니다. 이전에 해보지 않은 작업이기 때문에 Gwmi 명령이 필터링을 수행할 수 있는지 확인해 보겠습니다. Help Gwmi –full을 실행하면 몇 가지 예를 포함하여 명령이 작동하는 방식에 대한 자세한 설명을 볼 수 있습니다. -filter와 같이 유용한 것으로 보이는 매개 변수를 찾아서 이를 실행해 봅니다.

gwmi win32_logicaldisk -filter "drivetype = 3"

멋지게 작동합니다! 이제 드라이브 목록에 로컬 고정 디스크만 포함됩니다. 이로써 두 번째 문제가 해결되었습니다. 이제 첫 번째 문제를 해결해야 합니다. 즉, 불필요한 모든 속성을 제거합니다.

Get-Command를 실행하여 모든 Windows PowerShell cmdlet을 나열하여 Select-Object를 찾습니다. 설명을 통해 이것이 "개체 또는 개체 집합의 지정된 속성을 선택"한다는 것을 알 수 있습니다. 따라서 다음과 같이 합니다.

gwmi win32_logicaldisk -filter "drivetype = 3" | select freespace

Gwmi의 결과를 Select(Select-Object의 별칭)로 전달하여 원하는 속성만 얻을 수 있습니다. 하지만 우리에게 표시되는 것은 숫자 목록일 뿐이므로 결과가 적절하지 않습니다. 즉, 목록의 빈 공간이 어떤 드라이브에 해당하는지는 알 수 없습니다. 따라서 다시 문서를 보고 DeviceID 속성에 드라이브 문자가 포함된다는 것을 확인합니다. 그리고 명령을 다음과 같이 수정하여 다시 시도합니다.

gwmi win32_logicaldisk -filter "drivetype = 3" | select deviceid,freespace

완벽합니다! 두 속성만 나열되기 때문에 셸에서는 정보를 표 형태로 보기 좋게 표시할 수 있습니다. Windows PowerShell에서 목록과 표를 사용하도록 선택하는 시점에 대해서는 다음 달에 설명하겠습니다.

계산

이렇게 빈 공간에 대한 정보를 검색했지만 이 정보는 바이트 단위이므로 메가바이트 또는 기가바이트만큼 유용하지 않습니다. FreeSpace 속성 자체가 아니라 FreeSpace 속성에서 계산된 값이 필요합니다. 이 경우 ForEach-Object cmdlet(또는 % 등과 같은 해당 여러 별칭 중 하나)이 도움이 될 수 있습니다. 이 cmdlet을 사용하면 특수 변수 $_를 사용하여 현재 논리 디스크를 참조할 수 있으며 각 디스크의 속성에 개별적으로 액세스하여 특정 계산을 수행할 수 있습니다. 이제 명령을 다음과 같이 수정할 수 있습니다.

gwmi win32_logicaldisk -filter "drivetype = 3" | % { $_.deviceid; $_.freespace/1GB }

여기에서는 Select를 제거하고 이 자리에 ForEach-Object에 대한 별칭(%)을 추가하기만 했습니다. cmdlet에는 가져온 각 Win32_LogicalDisk에 대해 수행할 작업을 지정해야 하므로 DeviceID 속성을 가져와서 FreeSpace 속성을 기가바이트로 나누도록 지시했습니다. Windows PowerShell에서는 KB, MB 및 GB를 인식하므로 이렇게 하면 출력 결과가 기가바이트로 표시됩니다.

여러 컴퓨터

지금까지는 한 컴퓨터를 대상으로 작업했으므로 이제 여러 시스템을 대상으로 작업할 차례입니다. 텍스트 파일의 내용을 가져오는 방법은 알고 있습니다. MS-DOS® 시절에 사용하던 방법과 동일하게 Type 명령을 사용하면 됩니다. Windows PowerShell에서도 이 명령이 Get-Content의 별칭이기 때문입니다.

Type c:\computers.txt

이 컴퓨터들을 하나씩 가져와서 각 컴퓨터에 대해 앞서 수행한 WMI 명령을 수행해야 하는 경우 "각 컴퓨터"라는 문구에서 알 수 있듯이 이 작업에는 ForEach-Object라는 cmdlet을 사용하면 됩니다. 따라서 구구절절한 설명은 제쳐두고 최종 명령만 보자면 다음과 같습니다.

type c:\computers.txt | % { $_; 
gwmi –computername $_ win32_logicaldisk -filter "drivetype=3" | % { $_.deviceid; $_.freespace/1GB} }

알아보기가 힘든가요? cmdlet 이름 대신 별칭을 사용했기 때문에 읽기가 다소 어렵습니다. 하지만 하나씩 살펴보면 쉽게 이해할 수 있습니다.

  • 먼저 텍스트 파일의 내용을 입력합니다.
  • 이 내용을 ForEach-Object로 전달합니다.
  • ForEach-Object에서 $_ 변수를 사용하여 현재 항목, 즉 현재 컴퓨터 이름을 출력합니다.
  • 그런 다음 ForEach-Object에서 다른 ForEach-Object 호출이 있는 WMI 명령을 실행합니다.

이러한 별칭 이름을 cmdlet 이름으로 풀어서 쓰면 도움이 될 수 있습니다. 다음은 이와 동일한 명령인데, 여기서는 각 부분을 조금 더 쉽게 알아볼 수 있도록 cmdlet을 정확하게 입력하고 명령을 각각의 줄로 나누었습니다.

Get-Content C:\Computers.txt | 
ForEach-Object { 
 $_; Get-WMIObject –computername $_ 
Win32_LogicalDisk -filter "DriveType=3" | 
 ForEach-Object { 
 $_.DeviceID; $_.FreeSpace/1GB
 }
}

이 명령의 결과는 그림 3에 나와 있습니다. 그다지 보기 좋지는 않지만 원하는 정보가 모두 포함되어 있습니다.

그림 3 최종 결과

그림 3** 최종 결과 **(더 크게 보려면 이미지를 클릭하십시오.)

스크립팅이 필요 없음

이 연습의 핵심은 스크립팅을 수행하지 않고도 Windows PowerShell을 사용할 수 있다는 것을 보여주기 위한 것입니다. 또한 이와 같은 몇 가지 예와 함께 Windows PowerShell 자체를 조금만 살펴보면 수행하고자 하는 작업을 수행하는 데 필요한 여러 정보를 얻을 수 있습니다.

더 중요한 것은 Windows PowerShell은 언제든지 사용할 수 있다는 점입니다. 지금 바로 배워보십시오. 진작 사용하지 않았음을 후회하게 될 것이며 스크립팅이라는 단어가 더 이상 어렵게 느껴지지 않을 것입니다.

Don Jones는 SAPIEN Technologies의 수석 스크립팅 전문가이자 ScriptingTraining.com의 강사입니다. 문의 사항이 있으면 ScriptingAnswers.com을 통해 연락하십시오.

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