powershell 3.0 으로 테스트하였습니다.
PowerShell 은 좀 더 발전된 쉘 스크립팅을 지원한다.
텍스트 기반이 아닌 오브젝트 기반이며, 이로써 더 강력한 기능을 쉽게 가능하게 해준다.
이 점이 장점이 될지는 지켜봐야 하겠지만, 비-리눅스 개발자라면 메리트가 충분히 있어 보인다.
이와 같은 shell script 말고 ruby, python 을 shell script 처럼 사용하는 경우도 많지만,
shell script 가 파일경로 및 디렉토리 구조에 대해 쉽게 사용될 수 있도록 특화되어 있기 때문에
익숙하기만 하면 더 짧은 코드로 작성이 가능하다.
powershell 은 윈도우 쉘 답게 명령어에 대소문자를 가리지 않는다.
파라메터 규칙은 보통 -option 과 같은 방식을 따른다.
cmd shell 에서 보통 /option 과 같이 하는 것과 대조된다.
(아마도 윈도우 개발자들도 요즘은 linux 스타일 path 구분자 / 을 사용하는 경우가 많아서 그런게 아닐까 싶다)
이는 unix 계열의 구형 옵션 방식과 유사하다. (요즘은 거의 GNU style 로 통일되는 듯 싶지만)
[[출력해보기]]
echo 'hello'
write-host 'hello'
$your_name = 'name'
write-host "hello ${your_name}"
write-host "hello" ${your_name}
사실 echo 와 write-host 는 엄밀히 다르다.
write-host 가 cmd 의 echo 와 같으며, echo 는 복잡한 개체를 표시할 때 title column 이 표시되는 특징이 있다.
[[현재 폴더 모든 파일명앞에 'value = ' 을 붙여 출력하는 방법 #1]]
foreach($item in gci) { write-host 'value =' $item}
foreach($item in gci | select name) { write-host 'value =' $item.name}
foreach($item in gci | select *) { write-host 'value =' $item.name}
gci 는 Get-ChildItem 의 약자이자 alias 명령어로
dir 및 ls 과 유사하지만, 결과물을 item 목록으로 준다고 보면 된다.(오브젝트 기반 스크립트이므로)
select 는 그 목록 개별 레코드 중 특정 컬럼(오브젝트)만 취하는 것이다.
( bash 으로 하려면 복잡해진다. grep/awk 등 텍스트 파싱을 위한 여러 조합이 나올 것이다 )
object 기반이기 때문에 gci 의 결과물은 객체라 봐도 무방하다.
그래서 $item.name 같이 특정 컬럼(오브젝트)에 멤버 변수처럼 접근하는 것도 가능하다.
[[현재 폴더 모든 파일명앞에 'value = ' 을 붙여 출력하는 방법 #2]]
gci | ForEach-Object{write-host 'value =' $_}
gci | foreach{write-host 'value =' $_}
gci | %{write-host 'value =' $_}
이는 다소 독특한 방법인데, gci 의 출력(파일 리스트)의 요소 각각에 대해서 무언가 다른 작업을 해주는 것이다. ruby 의 .each{ 와 비슷한데 $_ 는 그 해당 요소 하나를 의미한다. 위에서는 $item 이라 보면 된다. % 는 축약형으로 사실은 ForEach-Object 이다. foreach 로도 사용할 수 있다.
(하지만, foreach(...) {} 과 같은 문법을 ForEach-Object 로는 대체할 수 없다!)
이 방법이 foreach(...) {...} 방식보다 쉘스크립트에 더 적합한 것 같다.
[[현재 폴더 모든 파일명 중에 'vim' 이라는 글자가 들어간 경우만 출력하는 방법]]
foreach($item in gci) { if($item.name -like '*vim*') { write-host $item} }
foreach($item in gci) { if($item.name.contains('vim')) { write-host $item} }
gci | %{if($_.name -like '*vim*') { write-host $_ }}
[[오브젝트 멤버 보기]]
python 의 dir. ruby 의 .methods 같은 기능이다.
powershell 은 객체지향이므로 이런 것을 알아두면 공부할 때 도움이 된다.
"text" | get-member // "text" 객체의 member 보기
[string] | get-member // string 타입의 member 보기
/* method 목록만 보기 */
// 맨위에 Name ===== 과 같은 헤더 컬럼명이 생략되는 방법
[string].GetMethods() | select name
// 맨위에 Name ===== 과 같은 헤더 컬럼명이 생략되는 방법(들)
[string].GetMethods() | %{$_.name}
[string].GetMethods() | %{write-host $_.name}
[string].GetMethods() | ft -hide
ft -hide 는 Format-Table -hidetableheaders 의 줄임 명령이다.