2014. 9. 22. 09:53

Powershell 구문에서 -Parameter와 |(Pipeline)을 사용하는데, 이것은 영어 문장의 [전치사와 접속사]와 유사하다. 전치사는 명사에 대한 보충 설명, 접속사는 문장에 대한 보충 설명을 할 때 사용한다.

Powershell 구문은 Verb-Noun -Parameter value (-Parameter2 value2…)이다.
여기서 사용하는 Parameter의 갯수가 많아질 수록 더욱 구체적이고 명확한 값을 불러 올 수 있다.

그리고 Verb-Noun의 결과를 다음 문장의 입력 값으로 사용하는 것이 Pipeline이다. Pipeline( | )은 결과를 나타내는 접속사(that, so that, to부정사)과 비슷한 역할을 한다.

전치사와 접속사를 사용한 영어 문장을 한 번 살펴보자.

  1. Set the table. (상 차려라.): Verb-Noun 구문으로서 명령문이다. [전치사를 추가한 문장]
    1. Set the table with the good dishes. (상을 차리되 좋은 그릇을 사용하여)
    2. Set the table for your friends. (상을 차리되 친구를 위해서)
    3. Set the table with the good dishes for your friends. (상을 차리되 좋은 접시를 사용하고 친구를 위해서)
  2. Set the table. (상 차려라.): Verb-Noun 구문으로서 명령문이다. [결과 접속사를 추가한 문장]
    1. Set the table so that you can have dinner.
    2. Set the table with the good dishes so that you can have dinner.
    3. Set the table so that you can have dinner to be full at last. (결과의 to부정사)
      (이 문장은 Verb-Noun so that( | ) Verb-Noun to( | ) Verb-Noun 형식이다. 즉, Pipeline을 계속해서 사용하는 경우이다.)

이제 parameter와 pipeline을 사용하는 Powershell 문장을 한 번 살펴보자.

1. Get-Process  (현재 실행되는 모든 프로세스를 확인한다. 그러므로 가장 많은 정보를 보여준다)
Get-Process -Name notepad (notepad라는 Process가 있는지만 확인한다. 좀 더 구체적이고 좁은 결과를 도출하는 것이다.)
Get-Process -Name  notepad -Computername remotecomputer
(원격 컴퓨터에서 notepad 프로그램이 실행중인지 확인. 2개의 매개변수를 사용하여 더욱 구체적인 정보를 원하는 것이다.)
Get-Process -Name notepad | Stop-Process
(notepad가 실행중인지 확인한다. 그런 다음 그 프로세스가 있으면 종료시킨다. pipeline을 사용하면 2차적으로 작업을 할 수 있다.)
Get-Process | Sort-Object -Property  pm -Descending | Select-Object -First 5
(pipeline을 1개 이상을 사용할 수 있다. 현재 실행중인 프로세스를 확인한다. 그런 다음 그것의 결과를 기준으로 정렬하는데 정렬하는 기준은 physical memory이고 내림 차순으로 한다. 그리고 이것을 결과를 기준으로 다시 한 번 pipeline을 하는데, 모든 정렬된 것 중에서 위에서 5개만 화면에 보여주는 것이다. 즉, 모든 내용을 보는 것이 아니라 가장 많이 물리적 메모리를 사용하여 프로세스 5개만 보고 싶은 것인 것이다.)

** 결론적으로 Powershell 구문 형식을 무작정 외워서 사용하지 말고, 영어 문장 형식대로 사용하면 된다는 것이다.
요약하면, 좀 더 구체적으로 자세한 결과를 원하는 -Parameter를 많이 사용하면 되고,
앞 문장의 결과를 다음 문장의 입력 값으로 사용하고 싶으면 Pipeline을 사용하면 된다는 것이다.


출처 : http://cloudsns.wordpress.com/category/microsoft/powershell/page/10/

Posted by pegasuss
2014. 9. 19. 17:00


  • Verb-Noun -Parameter value
  • Verb-Noun -Parameter1 value1 -Parameter2 value2
  • Verb-Noun -Parameter value | Verb-Noun -Parameter value

이 구문은 영어의 명령문하고 비슷하다. 예를 들면…

Love your son. (Verb-Noun)

Love your son with all your heart. (Verb-Noun -Parameter value)

여기서 with라는 전치사가 -Parameter(매개변수)와 비슷하다.

전치사를 사용하여 문장의 뜻을 명확하게 표현하듯이, 매개변수를 사용하여 정확하게 명령을 내리는 것이다.




.


출처 : http://cloudsns.wordpress.com/category/microsoft/powershell/page/10/

Posted by pegasuss
2014. 9. 19. 16:50

로컬 컴퓨터의 서비스를 중지하는 방법은 Stop-Service -Name servicename -Force이다.
Stop-Service는 -Force 매개변수가 있기 때문에 [의존하고 있는 서비스]가 있더라도 해당 서비스를 강제로 중지할 수 있다.
하지만 Stop-Service의 아쉬운 점은 RPC로 원격 컴퓨터를 제어하는 -Computername이라는 매개변수가 없다는 것이다.
그래서 원격 컴퓨터의 서비스(예를 들면 spooler 서비스)를 중지하는 방법은 다음의 방법을 사용해야 한다.
1) Set-Service: 이것을 사용하기 위해서는 관리자 권한으로 Powershell 콘솔 프로그램을 실행하여야 한다.
Set-Service -Name Spooler  -ComputerName 원격컴퓨터이름 -Status “Stopped”
이것의 약점은 -Force 매개변수가 없어서 의존하고 있는 서비스는 종료할 수 없다는 것이다.

2) Invoke-Command (강추): 원격 접속을 허용한 경우, 즉, Enable-PSRemoting -Force을 한 원격 컴퓨터
Invoke-Command -ComputerName 원격컴퓨터이름 { Stop-Service -Name Spooler -Force }
이것은 원하는 모든 것을 할 수 있어서 제일 추천되는 방법이다.
Invoke-Command의 내용은 로컬에서 구문이 제대로 되어 있는지 분석한 후 원격 컴퓨터에 접속하여 원격 컴퓨터에서 명령어를 실행하는 것이다. 그렇기 때문에 {     }의 내용이 원격에서 실행되기 때문에 Stop-Service가 원격에서 이루어지는 것이다.

다음은 원격 컴퓨터의 오디오 서비스를 중지하는 데모이다.
a) Help Get-Service
이렇게 하면 -DependentServices와 -RequiredServices라는 매개변수가 있음을 알 수 있다.
b) Get-Service -Computername Server1 -Name audiosrv -RequiredServices
이것을 결과를 보면 AudioEndpointBuilder, MMCSS, RpcSs 서비스가 나타난다. 즉, audiosrv가 시작되려면 이러한 서비스들이 모두 Start가 되어 있어야 한다는 것이다. 다른 말로 말하면autiosrv는 mmcss에 의존하고 있으며, 의존하고 있는 서비스를 가지고 있는 mmcss 서비스를 중지하려면 먼저 audiosrv 서비스를 중지해야 한다는 것이다. 그래서 우리가 원격에 있는 컴퓨터의 mmcss 서비스를 중지하려면 반드시 -Force 매개 변수를 사용해야 하는 것이다. 그런데 Set-Service는 -Force 옵션이 없고, Stop-Service는  -Computername 매개변수가 없다. 그래서 이를 해결하기 위해서는 가장 좋은 것이 Invoke-Command 명령어이다.

다시 거꾸로 설명하면.. Get-Service -Name mmcss -DependentServices를 실행하면 Windows Audio (audiosrv) 서비스가 의존하고 있다는 것을 알 수 있다. 그래서 원격 컴퓨터의 Multimedia Class Scheduler(mmcSS) 서비스를 중지하려면 Invoke-Command가 최적의 방안이다.
하지만 해당 서비스를 의존하고 있는 서비스가 없다면 (예를 들면, spooler, w32time, dns, dhcp..) 그냥 Set-Service -Force를 사용하거나 Invoke-Command를 사용하면 된다.

c) Stop-Service -Computername server1 (이것은 아예 안된다. 즉, stop-Service는 -computername 매개변수가 없다.)

d) Set-Service -ComputerName server1 -Name mmcss   -Status “Stopped”
이렇게 하면 종속 서비스를 포함하고 있기 때문에 중지할 수 없다고 나온다.

e) Set-Service -ComputerName server1 -Name audiosrv   -Status “Stopped”
이것도 안된다. audiosrv가 다른 서비스에 종속되기 때문이라고 안된다. 

f) Invoke-Command -Computername Server1 {Stop-Service -Name mmcss  -Force}
Invoke-Command -Computername Server1 {Stop-Service -Name audiosrv  -Force}
이렇게 하면 종속 서비스를 가지고 있는 서비스(mmcss)와 종속된 서비스인 audiosrv 모두 중지할 수 있다.

** 참고로 만약에 로컬 컴퓨터에 실행 중인 서비스인 경우에는 종속된 서비스인 audiosrv는 stop-service -name audio로 중지할 수 있지만,
종속된 서비스를 가지고 있는 mmcss는 stop-service -name mmcss로 중지할 수 없다. 그래서 반드시 -force 매개변수를 사용하여 중지해야 한다.
마지막으로, 꼭 알아야 할 것은 종속된 서비스를 가지고 있는 서비스를 죽이면 자동적으로 종속된 서비스들을 자연적으로 동시에 중지된다는 사실이다. 그러므로 mmcss와 같은 서비스를 중지하면 여기에 의존하고 있는 서비스인 audiosrv 서비스가 동시지 중지된다는 사실을 꼭 염두에 두어야 한다.


출처 : http://cloudsns.wordpress.com/category/microsoft/powershell/page/10/

Posted by pegasuss
2014. 9. 19. 16:24

Windows 7/2008R2에 Powershell v3.0 RC를 설치한 후 v2.0을 사용하고자 하는 방법은 다음과 같다.

1) Powershell의 버전을 확인하기 위해서
$PSVersionTable 
이렇게 하면 기본적으로 v3.0으로 나온다.

2) V3.0인 상태에서 V2.0을 사용하기 위해서는
powershell.exe -Version 2
이렇게 하면 V2.0이 로딩된다. 진짜 V2.0인지 확인하려면
$PSVersionTable 

V3.0은 .Net4.0을 사용하고 V2.0은 .Net2.0을 사용한다는 것을 염두에 둔다.


출처 : http://cloudsns.wordpress.com/category/microsoft/powershell/page/10/

Posted by pegasuss
2014. 9. 19. 16:16

Powershell을 이용하면 원하는 파일을 쉽게 찾을 수 있다.
여기서 핵심은 -filter 매개변수와 -recurse 매개변수이다

Dir c:\windows\system32 -Recurse -Filter *.msc  
(-Recurse: 하위 폴더까지 검색 / -Filter: 원하는 것만 필터링하여 검색)

dir c:\windows\ -recurse -filter au*.dll

dir c:\windows -recurse -filter sam

dir c:\windows -recurse -filter hosts

dir $home -recurse -filter *.jpg

자신이 가지고 있는 음악 및 사진 파일들이 여러 폴더에 흩어져 있다면 dir $home -recurse -filter *.jpg 형식으로 찾아서 복사하면 된다.
dir $home -recurse -filter *.jpg  | copy -destination d:\imsi
이렇게 하면 바탕화면 및 내 문서에 있는 모든 사진 파일을 D:\imsi 폴더로 몽땅 복사할 수 있다.
중요한 것은 상당히 빨리 작업이 이루어진다는 것이다.


출처 : http://cloudsns.wordpress.com/category/microsoft/powershell/page/11/

Posted by pegasuss