Set-Date Write-Debug Get-Item Get-WmiObject각각의 커맨드는 동사와 명사 사이에 하이픈으로 연결된다. 커맨드의 명사는 복수형을 써야 할 것 같은 상황이라도 단수형을 쓴다.
Get-Process현재 동작 중인 모든 프로세스를 반환한다. (역자: 여러 프로세스를 가져올 것이지만, Get-Processes가 아닌 Get-Process로 사용한다.)
join-path c:\ \temp결과는 C:\temp 가 된다.
Get-Command그리고 Get-Help가 있는데, Get-Help는 특정한 커맨드의 사용법을 알려준다.
Get-Help Get-Member는 커맨드 Get-Members에 대한 도움말을 보여준다. 또는 다음과 같이 -? 파라미터를 전달할 수 있다.
Get-Member -?이 내장 커맨드는 또한 다른 레벨의 설명을 제공한다. 기본 설명은 기초적인 정보를 보여준다. Get-Help에 -detailed를 파라메터로 붙여 상세한 설명을 제공받을 수 있다.
Get-Help Get-Member -detailed여기에 더욱 보강된 설명을 얻고자 하면 -full을 사용한다.
Get-Help Get-Member -full대다수의 커맨드들이 상당히 긴데, 우리 컴퓨터 족들은 보통 긴 명령어를 싫어한다. 그래서 파워쉘은 커맨드의 별칭들을 제공한다. 다음과 같은 모든 별칭의 리스트를 볼 수 있다.
PS C:\WINDOWS\system32> Get-Alias CommandType Name Definition ----------- ---- ---------- Alias ac Add-Content Alias asnp Add-PSSnapin Alias clc Clear-Content Alias cli Clear-Item Alias clp Clear-ItemProperty ...원하는 커맨드를 찾을 때 Tab 키는 특별한 기능을 제공한다. 만약 동사를 기억한다면 동사와 하이픈를 입력하고 Tab을 반복해서 누르면 해당하는 동사로 시작하는 명령어가 자동으로 입력되며 순환한다. 만약 아래와 같이 입력했다면,
Get-Tab을 눌러보아라. Get-Acl, Get-Alias, Get-AuthenticodeSignature 등등 명령어를 보게 될 것이다. Tab 표현식은 유연한 편이 바람직한데, MS도 이를 알고 있기 때문에 Tab표현식을 수정할 수 있게 하였다. 인터넷에서 PowerShell TabExpansion(Tab과 Expansion사이에 공백을 넣지 말 것)에 대해서 검색해보면 정보를 찾을 수 있을 것이다. 다른 사람들이 이미 Tab 표현식을 작성해 놓은 것이 있는데, 일부는 꽤 유용하다. 그 중에서 필요한 것을 찾아 사용하면 된다. (추가적으로, Get-Content function:TabExpansion을 사용하면 TabExpansion function의 소스를 볼 수 있다.) 여기 필자가 자주 사용하는 몇몇 커맨드를 나열했다. 커맨드를 사용할 때, 아마도 사용할 수 있는 별칭에 대해서도 알고 싶을 것이다..
커맨드 | 별칭 |
---|---|
Copy-Item | cpi, cp, copy |
ForEach-Object | foreach, % |
Get-ChildItem | dir, ls |
Get-Command | gcm |
Get-Content | cat, type |
Get-Content | gc, type, cat |
Get-Help | help |
Get-Location | gl, pwd |
Move-Item | mi, mv, move |
Remove-Item | ri, rd, del, rm, rmdir |
Rename-Item | rni, ren |
Set-Location | cd, chdir |
Where-Object | where |
Get-Command *Format*동사 Format으로 시작되는 커맨드를 찾고싶을 수도 있다 (Format-Table과 같이). 그럴 때는 이렇게 입력한다.
Get-Command -verb Format동사가 정확히 Format인 커맨드인 명령어를 반환할 것이다. 만약 아래와 같이 입력하면,
Get-Command -verb Form아무런 결과도 얻지 못할 것이다. 이럴 때는 와일드카드 형식을 쓴다:
Get-Command -verb Form*유사하게 명사에 대해서도 적용 할 수 있다.
Get-Command -noun AliasAlias라는 단어가 들어가는 커맨드를 확인할 수 있을 것이다..
5당신은 숫자형을 선언한 것이다. 변수 이름은 $로 시작하며 숫자를 다음과 같이 저장할 수 있다.
PS C:\> $a = 5 PS C:\> $a 5 PS C:\>GetType()을 호출하여 내장된 .NET 타입을 알아낼 수 있다.
PS C:\> $a.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Int32 System.ValueType파서는 또한 다른 기본 타입도 알아낼 수 있다. 더블형은 소수점을 이용해 만들어 진다.
PS C:\> $b = 3.1415926 PS C:\> $b 3.1415926 PS C:\> $b.GetType().Name Double오늘날의 대다수의 스크립트 언어와 마찬가지로 스트링에 외 따옴표와 겹 따옴표를 모두 사용할 수 있다. 이는 몇몇 문제 상황에 편리한데, 이를테면 스트링에 겹 따옴표가 있으면 스트링 자체는 외 따옴표로 정의한다.
$c = ""
배열을 생성하기 위해서는 단지 항목을 구분하는 콤마를 쓰면 된다.
PS C:\> $d = 1,2,3,"Hello"
PS C:\> $d
1
2
3
Hello
PS C:\> $d.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
필요하다면 배열 주위를 괄호로 묶을 수 있다. 이것은 배열 안에 배열을 넣을 때 유용하다.
$e = (1,2,3,(4,5,6))숫자의 범위는 .. 연산자를 사용하여 다음과 같이 지정할 수 있다.
$f = 1..51,2,3,4,5를 포함하는 배열이 생성될 것이다.
PS C:\> $myhash = @{ "one"=1; "two"=2; "three"=3 } PS C:\> $myhash Name Value ---- ----- two 2 three 3 one 1 PS C:\> $myhash["one"] 1 PS C:\> $myhash["four"] PS C:\>.NET은 강력한 정규 표현식을 지원하기 때문에, 파워쉘 역시 regex 타입을 지원한다. 정규 표현식을 생성하기 위해서는 대괄호([ ]) 안에 regex를 넣고 뒤에 문자열을 덧붙인다. 그러면 -match 연산자를 이용하여 정규 표현식을 사용할 수 있다.
PS C:\> $re = [regex]"abc[123]" PS C:\> "abc1" -match $re True PS C:\> "abc4" -match $re False PS C:\>만약 정규 표현식에 익숙치 않다면 지금이 배워야 할 때이다. 다른 프로그래밍 언어도 그렇지만, 정규 표현식을 많이 알수록 파워쉘을 더욱 쉽게 쓸 수 있다. 자주 사용하는 검색엔진으로 가서 "정규 표현식 배우기"라고 입력해봐라. 괜찮은 페이지가 몇 개 나올 것이다. 그렇지만 가장 좋은 자료는 제프리 프리들이 저술한 오렐리의 정규 표현식 완전 해부와 실습(Mastering Regular Expressions) 이다.
scite (join-path $pshome types.ps1xml)
C:\WINDOWS >dir /ad | more Volume in drive C has no label. Volume Serial Number is BCFB-2313 Directory of C:\WINDOWS 11/04/2006 10:59 PM사람들은 이러한 파이프가 텍스트를 다루는데 막강한 유틸리티 라는 것을 알게 되었다. 몇 년 전에 awk와 grep이 개발되었고 이를 이용해서 텍스트를 처리하게 되었다. (awk는 공백으로 구분되는 레코드 파일로부터 조건을 만족하는 결과를 쉽게 얻을 수 있다. grep은 텍스트에서 패턴을 만족하는 부분을 찾을 수 있으며 현재까지도 많이 사용된다) 현재에 이르러서는 Perl 같은 훨씬 강력한 텍스트 처리 언어를 사용한다.. 11/04/2006 10:59 PM .. 06/07/2004 07:03 PM $NtUninstallKB824105$ 06/07/2004 07:05 PM $NtUninstallKB824141$ 10/15/2004 09:06 PM $NtUninstallKB824151$ 06/07/2004 07:01 PM $NtUninstallKB825119$ 06/07/2004 07:00 PM $NtUninstallKB828035$ 06/07/2004 06:58 PM $NtUninstallKB828741$ 06/07/2004 06:59 PM $NtUninstallKB833407$ -- More --
PS C:\WINDOWS> dir | sort LastWriteTime | more Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 7/4/1995 1:33 PM 11776 Ckrfresh.exe -a--- 7/31/1995 5:44 PM 212480 PCDLIB32.DLL -a--- 5/3/1996 10:36 AM 18432 Setup_ck.dll -ar-- 5/3/1996 12:21 PM 27648 Setup_ck.exe -a--- 7/22/1998 12:29 AM 21 CS_SETUP.ini -a--- 10/29/1998 3:45 PM 306688 IsUninst.exe -a--- 1/12/1999 10:39 AM 6656 delttsul.exe -a--- 1/12/1999 10:40 AM 29184 rmud.exe -a--- 6/18/1999 4:49 PM 165888 Ckconfig.exe -a--- 11/10/1999 3:05 PM 86016 unvise32qt.exe ...(dir은 Get-Children의 별칭이고 sort는 Sort-Object의 별칭이다. 그리고 more는 Out-Host -paging을 호출한다. 따라서 dir | sort LastWriteTime | more는 Get-Children | Sort-Object | Out-Host -Paging.을 줄인 것이다.)
PS C:\WINDOWS> $a = dir | sort LastWriteTime변수 $a는 지금 Sort-Object 커맨드의 결과를 담고 있는데 $a의 내용은 단순한 텍스트가 아니다. dir(Get-ChildItem) 커맨드는 FileInfo와 DirectoryInfo 오브젝트의 리스트를 리턴받아 sort (Sort-Object) 커맨드에 전달했다. 따라서 $a는 FileInfo와 DirectoryInfo 오브젝트의 리스트이다. 아래와 같이 대괄호를 이용해서 각각의 원소에 접근할 수 있다.
PS C:\WINDOWS> $a[0] Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 7/4/1995 1:33 PM 11776 Ckrfresh.exe PS C:\WINDOWS> $a[1] Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 7/31/1995 5:44 PM 212480 PCDLIB32.DLL다음 섹션에서 오브젝트의 멤버함수 호출에 대해서 더 자세히 다루겠다. 여기서는 GetType() 함수를 호출해서 해당 오브젝트(단순한 텍스트가 아닌)의 타입을 알아보자. 아래는 내가 변수 $a 의 타입을 알아본 것이다.
PS C:\WINDOWS> $a.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Object[] System.Array 오브젝트 $a는 배열이다. 이제 첫번째 원소가 무엇인지 알아보자. PS C:\WINDOWS> $a[0].GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True FileInfo System.IO.FileSystemInfo6. 오브젝트 활용하기
PS C:\Documents and Settings\Jeff> $a = "abc" PS C:\Documents and Settings\Jeff> Get-Member -InputObject $a TypeName: System.String Name MemberType Definition ---- ---------- ---------- Clone Method System.Object Clone() CompareTo Method System.Int32 CompareTo(Object value),... Contains Method System.Boolean Contains(String value) CopyTo Method System.Void CopyTo(Int32 sourceIndex,... EndsWith Method System.Boolean EndsWith(String value)... ...특정 커맨드의 결과를 파이프로 Get-Member에 넘기면 Get-Member는 커맨드가 리턴한 오브젝트의 멤버 리스트를 보여줄 것이다. 같은 타입인 두 오브젝트가 넘겨지는 경우에는 Get-Member는 타입에 대한 멤버의 목록을 한번만 보여줄 것이다. 예를 들어 당신이 Get-Process 커맨드로 리턴 받은 오브젝트의 멤버에 대해서 알고싶다고 하자. 그러면 파이프로 Get-Member에게 아래와 같이 전달한다.
PS C:\Documents and Settings\Jeff> Get-Process | Get-Member TypeName: System.Diagnostics.Process Name MemberType Definition ---- ---------- ---------- Handles AliasProperty Handles = Handlecount Name AliasProperty Name = ProcessName NPM AliasProperty NPM = NonpagedSystemMemorySize PM AliasProperty PM = PagedMemorySize VM AliasProperty VM = VirtualMemorySize WS AliasProperty WS = WorkingSet add_Disposed Method System.Void add_Disposed(Event... add_ErrorDataReceived Method System.Void add_ErrorDataRecei... ...Where-Object 커맨드는 주로 파이프라인에서 사용되며 정의된 기준을 만족하는 오브젝트만을 통과시킨다. 필터링 기준을 정의하여 파이프라인을 통과한 오브젝트의 멤버에만 접근하게 된다.
PS C:\Documents and Settings\Jeff> Get-Process | Where-Object {$_.VirtualMemorySize -gt 104857600} Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 948 15 38928 52788 346 12.23 712 dexplore 256 10 72624 81592 194 136.00 2664 firefox 350 14 30948 44268 133 7.06 3576 OUTLOOK 309 8 31928 6404 833 221.14 356 sqlservr 334 9 22188 14784 817 0.53 852 sqlservr 1598 91 18668 27404 142 156.75 1864 svchost 356 24 15708 23740 169 201.47 1536 WINWORDWhere-Object 커맨드는 스크립트의 중괄호 안에 파라메터 값을 취한다. 그 스크립트는 파이프라인으로 넘겨받는 모든 오브젝트 대해 수행된다. 넘겨진 오브젝트 들은 변수 $_ 에 대입된다. 따라서 $_.VirtualMemorySize는 현재 파이프라인에 있는 오브젝트의 멤버 VirtualMemorySize를 가리킨다. -gt는 ~ 보다 크다는 비교 연산자다. 따라서 현재 오브젝트의 가상 메모리 크기가 100 MB보다 큰지 아래와 같이 테스트 할 수 있다.
Get-ChildItem | foreach { $_.Fullname }지금까지 보았듯이 오브젝트의 멤버들에 익숙해져야 한다. 관련 내용은 온라인 도움말을 이용해서 찾아볼 수 있다. 온라인 도움말로 이동했으면 우선 시스템을 클릭하고 다시 스트링을 클릭하면 이제 스트링 클래스의 도움말 페이지에 도달해있을 것이다. 페이지의 하단부(왼쪽 창의 트리안)에 String Members라는 항목이 있다. 그 페이지는 스트링 클래스의 모든 멤버 리스트를 보여준다.
PS C:\> $a = "This is a test" PS C:\> $a.EndsWith("test") True PS C:\> $a.EndsWith("this") False PS C:\>7. 출력 형식
Get-Process | Format-Table Id, Name Id Name -- ---- 2876 alg 532 ApntEx 2044 Apoint 3448 calc 1824 CFSvcs 2176 cmd 3760 cmd 1640 Crypserv 1316 csrss위의 결과는 기본 세팅을 무시하고 테이블의 ID와 Name 컬럼을 출력한 것이다.
PS C:\Documents and Settings\Jeff> Get-PSDrive Name Provider Root CurrentLocation ---- -------- ---- --------------- Alias Alias C FileSystem C:\ Documents and Settings\Jeff cert Certificate \ D FileSystem D:\ Env Environment Function Function HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE Variable Variable예를 들면 Alias는 별칭의 리스트를 의미하는 드라이브다. 아래와 같이 원하는 어느 드라이브로든 변경할 수 있다.
PS C:\WINDOWS\system32> cd alias: PS Alias:\> PS Alias:\> dir CommandType Name Definition ----------- ---- ---------- Alias ac Add-Content Alias asnp Add-PSSnapin Alias clc Clear-Content Alias cli Clear-Item Alias clp Clear-ItemProperty Alias clv Clear-VariableAlias: 드라이브는 하위 디렉터리를 지원하지 않지만 Registry 같은 경우에는 지원한다.
PS Alias:\> cd HKCU: PS HKCU:\> dir Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER SKC VC Name Property --- -- ---- -------- 2 0 AppEvents {} 1 0 CLSID {} 4 32 Console {ColorTable00, ColorTable01, ColorTab... 24 1 Control Panel {Opened} 0 8 Environment {BAKEFILE_PATHS, INCLUDE, LIB, PROMPT... 0 1 HBA {Version} 1 5 Identities {Identity Ordinal, Migrated5, Last Us... 3 0 Keyboard Layout {} 0 0 Movie Magic Screenwriter {} 19 0 Movie Magic Screenwriter Vo... {} 0 0 Network {} 1 1 Note-It {(default)} 4 1 Printers {DeviceOld} 1 1 RemoteAccess {InternetProfile} 1 7 S {AutodiscoveryFlags, DetectedInterfac... 100 1 Software {(default)} 0 0 UNICODE Program Groups {} 2 0 Windows 3.1 Migration Status {} 1 0 Win_32 {} 0 1 SessionInformation {ProgramCount} 0 7 Volatile Environment {LOGONSERVER, CLIENTNAME, SESSIONNAME... PS HKCU:\> cd Software\Microsoft PS HKCU:\Software\Microsoft> dir Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microso ft SKC VC Name Property --- -- ---- -------- 1 0 Active Setup {} 3 0 ActiveMovie {} 2 0 Advanced INF Setup {} 1 0 ASF Stream Descriptor File {} 1 0 Automap {} 1 4 Broadband Networking {StatusTimeout, InternetStatusTimeout... 1 1 ClipArt Gallery {UserAdded} 0 5 Clipbook {WindowsClipBook Viewer, WindowsClipb... 0 2 Clock {iFormat, {CCF5A555-D92E-457b-9235-2B...DOS에서처럼 여기서도 파일명에 패턴을 쓸 수 있다.
PS HKCU:\Software\Microsoft> dir *windows* Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microso ft SKC VC Name Property --- -- ---- -------- 3 0 Windows {} 0 1 Windows Genuine Advantage {code} 0 5 Windows Help {Maximized, Xl, Xr, Yd...} 1 0 Windows Media {} 1 0 Windows NT {} 1 0 Windows Script {} 1 0 Windows Script Host {}?는 문자 하나와 매칭된다. 예를 들면 abc? 는 abc로 시작하며 뒤에 문자 하나가 붙은 문자열과 매치된다. 대괄호를 써서 매치할 문자열을 정의할 수도 있다. abc[123]은 abc1, abc2, 그리고 abc3과 매치된다.
Get-Process | Where-Object {$_.VirtualMemorySize -gt 104857600}For-Each 오브젝트는 리스트의 각각 아이템에 대하여 스크립트를 실행시킨다.
PS C:\WINDOWS\system32> 1..10 | foreach { $_ * 2 } 2 4 6 8 10 12 14 16 18 20이것만으로는 별로 유용한 예제는 아닌 듯하다. 이러한 기법은 다양하게 응용될 수 있다. 이를테면 디렉터리 내의 첫번째 줄에 "#backup"이라는 문자열이 들어가는 모든 txt 파일을 C:\backups 디렉터리로 복사할 수 있다.
dir *.txt | foreach { if ((Get-Content $_ -totalCount 1) -eq "#backup") { copy $_ c:\backups } }우선 dir 커맨드의 결과가 파이프를 통해서 foreach 커맨드로 보내진다. foreach 커맨드는 각 항목마다 중괄호로 쌓여진 스크립트를 실행한다. 이 스크립트는 각 파일의 첫번째 줄을 읽어서(Get-Content의 -totalCount 1 은 첫번째 줄만 허용) #backup과 비교한다. 만약 문자열이 맞으면 스크립트는 그 파일을 복사한다.
function Backup-TextFiles { dir *.txt | foreach { if ((Get-Content $_ -totalCount 1) -eq "#backup") { copy $_ c:\backups } } }이 함수를 프로파일에 추가한다. 프로파일은 각자의 홈 디렉터리에 있는 Profile.ps1이라는 파일이다. 홈 디렉터리는 \Documents and Settings\
이전 글 : 오픈라즐로 애플리케이션 개발하기
다음 글 : 프리팩토링 개론
최신 콘텐츠