336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Select-Object

명령의 결과 제한

PS > get-process | Select-Object -first 3

# 첫 번째의 3개의 서비스 출력
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.00       0.00       0 253
      0     0.00       0.00       0.00       1   1
      0     0.00       0.00       0.00      59  59


PS > get-process | Select-Object -last 3

# 마지막의 3개의 서비스 출력
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       3.41     542.72     753   1 WiFiAgent
      0     0.00       1.94     220.67     465 465 WiFiProxy
      0     0.00       8.80      63.28    1402 402 XprotectService


PS > get-process | Select-Object -Skip 395

# 첫 395개의 목록을 제외하고 출력
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00      11.27       8.43   39626   1 webinspectord
      0     0.00       3.41     542.74     753   1 WiFiAgent
      0     0.00       1.94     220.67     465 465 WiFiProxy
      0     0.00       8.80      63.28    1402 402 XprotectService


PS > get-process | Select-Object -index 0,3

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.00       0.00       0 253
      0     0.00       0.00       0.00      60  60


PS > get-process | Select-Object -index (3..6)

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
      0     0.00       0.00       0.00      60  60
      0     0.00       0.00       0.00      62  62
      0     0.00       0.00       0.00      63  63
      0     0.00       0.00       0.00      64  64

표시할 속성 지정


PS > Get-Process | Select-Object -Property ID,PM -first 3

Id PM
-- --
 0  0
 1  0
59  0

표시할 개체 목록과 개체 속성 선택하기

# 동작중인 로컬 인쇄 스풀러 서비스 찾기
PS > Get-Service -Name App*

# 스풀러 서비스와 종속성이 잇는 서비스 목록을 확인하는 멤버를 찾는다.
PS > Get-Service -Name Spooler | Get-Member | Select-Object -Last 7

# 스풀러 서비스에 종속성이 있는 서비스 목록을 선택
PS > Get-Service -Name Spooler | Select-Object -Property ServicesDependedOn


사용자 지정 속성 사용하기

기본으로 포함된 속성 이름을 좀 더 알기 쉬운 레이블로 변경하거나 특정 속성의 값을 인식하기에 편한 단위로 계산해 표시할 수 있다. 계산된 속성은 해시 테이블이라는 구조로 입력한다.


  • 사용자 지정 속성의 레이블 지정 : label or l, name or n
  • 사용자 지정 속성의 표현식 : expression or e.표현식 내에서는 $PSItem(또는 $_)를 사용하여 파이파의 개체 컬렉션의 각 개체를 참조한다.

<사용자 지정 속성을 만드는 해시 테이블>

@ { # @ : 해시 테이블
     N = 'PagineMemory'; # 레이블 키  = 레이블 문자열 값
     E={ $PSItem.PM }      # 표현식 키 = 표현식 스크립트 블록
}

<< 크기를 바이트 단위로 표시하는 Get-ChildItem 실행 결과>>

PS /> Get-ChildItem -Path /dev/Scala_sample/src/main/scala/example/ | Select-Object -Property Name,Length

Name Length
---- ------
AbsIterator.scala 99
ApplyFunctionTest.scala 526
Classes.scala 163
Combinator.scala 2373
CubeCalculator.scala 95
CurryTest.scala 388
Decorator.scala 618
FilterTest.scala 353
FunctionTest.scala 2446
LoopTest.scala 6044
Main.scala 125
PartiallyAppliedFunction.scala 1185
Point.scala 345
RichIterator.scala 139
Similarity.scala 124
StringIterator.scala 224
StringIteratorTest.scala 207
TestMain.scala 189
TraitsTest.scala 225



위 파워셸 명령을 헤시 테이블로 고쳐서 실행

PS /> Get-ChildItem -Path /dev/Scala_sample/src/main/scala/example/ | Select-Object -Property Name,@{n='Size(MB)'; e={$PSItem.Length/1MB}}

Name Size(MB)
---- --------
AbsIterator.scala 9.44137573242188E-05
ApplyFunctionTest.scala 0.000501632690429688
Classes.scala 0.000155448913574219
Combinator.scala 0.00226306915283203
CubeCalculator.scala 9.05990600585938E-05
CurryTest.scala 0.000370025634765625
Decorator.scala 0.000589370727539063
FilterTest.scala 0.000336647033691406
FunctionTest.scala 0.00233268737792969
LoopTest.scala 0.00576400756835938
Main.scala 0.000119209289550781
PartiallyAppliedFunction.scala 0.00113010406494141
Point.scala 0.000329017639160156
RichIterator.scala 0.000132560729980469
Similarity.scala 0.000118255615234375
StringIterator.scala 0.000213623046875
StringIteratorTest.scala 0.000197410583496094
TestMain.scala 0.000180244445800781
TraitsTest.scala 0.000214576721191406


MB (메가 바이트)로 변환이 되었으나 소수점 자릿수가 많이 나온다. 이렇게 숫자에 소수점 자리가 있는 경우 '번호 서식'을 적용해 표시하는데 데이터의 서식과 소수점 이하 자릿수를 제한할 수 있다.


{[인덱스 번호]:[적용할 서식][자릿수 지정자]} -f [서식 문자열]


  • 숫자 N
  • 통화 C
  • 10진수 D
  • 백분율 P
  • 16진수 X

예) "{0:N2}" -f 42.12345

예제) 시스템의 볼륨 정보 표시
# Get-Volume으로 기본 출력 형식을 확인
# 드라이브 문자와 전체 크기, 남은 크기만 표시하는 명령 구문을 실행
Get-Volume | Select-Object -Property DriverLetter,Size,SizeRemaining

# 전체 크기와 남은 크기의 레이블을 각각 '전체크기(GB)' 와 '남은 크기(GB)'로 표시하고 단위는 기가바이트로 표시
Get-Volume | Select-Object -Property DriverLetter,
@{n='전체 크기(GB)'; e={'{0:N2}' -f ($PSItem.Size/1GB)}},
@{n='남은 크기(GB)'; e={'{0:N2}' -f ($PSItem.SizeRemaining/1GB)}},\


블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

IF 문

$ServiceName = "Hyper-V 가상 컴퓨터 관리"
$HostName = hostname
$Service = Get-Service -DisplayName $ServiceName -ErrorAction SilentlyContinue

If (-Not $Service){
    $ServiceName + "는" + $HostName + "에 설치되지 않았습니다."
    Write-Host "Hyper-V 서비스를 설치합니다."
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
} ElseIf($Service.Status -eq "Running"){
    $ServiceName + "가 동작 중입니다."
} Else {
    $ServiceName + "가 중지되었습니다."
    Start-Service -Name $Service.Name
}

네이티브 DOS 명령인 hostName으로 현재 컴퓨터 이름을 가져와 변수에 저장


$Service = Get-Service -DisplayName $ServiceName -ErrorAction SilentlyContinue


에서는 'Hyper-V 가상 컴퓨터 관리' 라는 이름의 서비스를 찾아서 변수에 저장


If (-Not $Service)

부정 연사자인 -Not 에 의해 If문이 참이 되어 Hyper-V 서비스를 설치하는 구문이 실행


ElseIf($Service.Status -eq "Running"

서비스 상태가 실행 상태인지 확인


Else {
$ServiceName + "가 중지되었습니다."
Start-Service -Name $Service.Name
}

마지막으로 서비스가 중지된 경우 다시 시작시키는 구문을 실행




Switch 문

Switch 키워드 다음에 스위치를 사용하지 않으면 기본적으로 대소문자를 구분하지 않는다. 평가되는 값에 대해 정확한 일치를 평가하는 -exact 스위치가 사용된다.


구문 형식

Switch [-regex|-wildcard\-exact] [-casesensitive] (평가 되는 값)
{
조건1 {동작}
.....
Default {동작}
}
Switch문의 형식


옵션 

 설명

 평가되는 값

  •  Switch ($Option)
  • Switch (1,3), Switch("Red")
  • Switch (1..7)
  • Switch (Get-Service)

 -regex

 평가되는 값에 대해 정규식 조건 매칭

 -wildcard

 와일드카드 문자 조건 매칭

 -exact

 정확한 일치 조건 

 -casesensitive

 대소문자 구분

 -조건N

 


예) 위도우의 논리 디스크 정보를 확인해 디스크 유형에 따라 정보를 표시

$drive = Get-CimInstance -ClassName Win32_LogicalDisk `
-Filter "DeviceID='C:'"

switch ($drive.DriveType) {
    3 { Write "로컬 고정 디스크" }
    5 { Write "광학 디스크 장치" }
    Default { Write "기타 장치" }
}


Get-CimInstance 명령어

윈도우에서 시스템 전반의 자원에 대한 정보를 저장하는 CIM 리포지토리(일종의 데이터베이스)를 다루는 명령 중 하나.



switch 문의 평가되는 값 부분에 Get-Service를 실행한다.

실행 시점에 가져온 객체 컬렉션의 각 값($_)에 일치하는 조건 스크립트 블록을 평가해 동작을 수행한다.

switch (Get-Service)
{
{$_.status -eq "Running"}{"실행중인 서비스:"+$_.name}
{$_.status -eq "Stopped"}{"중단된 서비스:"+$_.name}
}




와일드카드 패턴 사용 

와일드카드 패턴을 이용할 시 일치 여부를 비교하는 대상이 무엇인지 구문에 알려주는 매개변수를 지정해야 한다.

아래 예제는 컴퓨터 이름에 따라 메시지를 출력하는 예제이다.


만약 컴퓨터 이름이 SEOUL-CL1 이라면  "SEOUL-CL1*" "SEOUL*" "*1" 와 모두 일치하므로 3개의 스크립트 블록이 실행된다. 이처럼 Switch 문은 If문과 달리 첫 번째 일치 조건만 실행하지 않고 각각의 일치하는 스크립트 블록을 모두 실행한다.

#환경 변수에서 컴퓨터 이름을 가져온다,
$name = Get-Content Env:\COMPUTERNAME
#Switch 문 블록
switch -Wildcard ($name) {
    "SEOUL-CL1*" {
        Write-Host "이 컴퓨터는 클라이언트다."
    }
    "SEOUL*" {
        Write-Host "이 컴퓨터는 SEOUL에 있다."
    }
    "*DC*" {
        Write-Host "이 컴퓨터는 도메인 컨트롤러다."
    }
    "*1" {
        Write-Host "첫 번째 컴퓨터다."
    }
    Default {
        Write-Host "일치하는 내용이 없다."
    }
}



만약 다중으로 일치하는 상황을 피하고자 한다면 Break 키워드를 사용하면 된다.

$name = Get-Content Env:\COMPUTERNAME
Switch -Wildcard ($name) {
    "SEOUL-CL1*" {
        Write "이 컴퓨터는 클라이언트다."
        break
    }
    "SEOUL*" {
        Write "이 컴퓨터는 BUSAN에 있다."
    }
    "*DC*" {
        Write "이 컴퓨터는 도메인 컨트롤러다."
        break
    }
    "*1" {
        Write "첫 번째 컴퓨터다."
    }
    Default {
        Write "일치하는 내용이 없다."
    }
}



ForEach문

다수의 개체를 담고 있는 컬렉션을 열면서 한 번에 하나의 개체에 어떤 처리를 해야할 경우 사용


ForEach ($temp in $Collection)
{
#$temp에 대한 처리 구문
}

ForEach 문은 $Collection에 저장된 개체들을 임시 변수인 $temp에 하나씩 담아 스크립트 블록 내의 코드로 반복 처리한다.


아래 코드는 ComupterNames.txt 파일에 한 줄에 컴퓨터 이름을 하나씩 읽어서 출력하는 명령이다.

#컴퓨터 이름 컬렉션을 변수에 저장한다.
$ComputerNames = Get-Content ComputerNames.txt
#컬렉션의 컴퓨터 이름 목록을 하나씩 처리한다.
ForEach ($pcname in $ComputerNames) {
Write-Host "현재 컴퓨터 이름은 $pcname 입니다."

}



$Services = Get-Service
ForEach ($Service in $Services) {
Write-Host "현재 서비스는 $($Service.name) 입니다."
}




For 문

For ($num=0 ; $num -le 9 ; $num++) {
Write-Host "Computer $num"
}


#컬렉션(배열) 만들기
$fruits = @("사과","오렌지","수박","배","포도","딸기","바나나")

#컬렉션 처리
For ($i=0; $i -lt $fruits.Length; $i++) {
$fruits[$i]
}



# https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_for?view=powershell-6
Get-Help about_For -ShowWindows     




While문

#컬렉션(배열) 만들기
$fruits = @("사과","오렌지","수박","배","포도","딸기","바나나")

#컬렉션 처리
$i=0
While ($i -lt $fruits.Length) # lt : less then
{
$fruits[$i]
$i++
}



Do 문


Do-While 문을 사용한 메모장 프로그램 실행

# Start-Process : https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-6
$NumOfNotepad=0
do
{
$NumOfNotepad++
$NotePadID=Start-Process -FilePath notepad
}
while ($NumOfNotepad -le 2)



Do-Until문

$NumOfNotepad=0
do
{
$NumOfNotepad++
$NotePadID=Start-Process -FilePath notepad
}
until ($NumOfNotepad -gt 2)

메모장의 개수가 3인 되는 순간 Do 문은 끝난다.



Break 와 Continue문

$NumOfShots = 0
while ($True)
{
$MovingTarget = (Get-Date).Second
if ($MovingTarget -eq $NumOfShots)
{
Write-Host "이동 목표를 맞추는데 사용된 슈팅 횟수(s):$NumOfShots"
Break
}
$NumOfShots++
}



다음 예제는 ForEach문을 사용해 현재 시스템의 프로세스 목록 중에서 물리 메모리를 250MB 이상 사용하는 프로세스만 출력하도록 한다.

$ProcessLists = Get-Process
foreach ($Process in $ProcessLists)
{
if (($Process.PM/1MB) -le 250)
{
Continue
}
Write-Output ($Process.Name+'은 250MB 이상의 메모리를 사용한다.')
}



* 실습



$NumOfNotepad=0
# 동적 배열 변수를 ArrayList 형식의 변수를 만듬
$PIDs = New-Object System.Collections.ArrayList
do
{
$NumOfNotepad++
$NotePadID=Start-Process -FilePath notepad -PassThru
# 실행된 메모장의 프로세스 ID를 가져와 배열에 추가
$PIDs.Add($NotePadID.Id)
}
while ($NumOfNotepad -le 3)

# 1초간 정지
Start-Sleep -Seconds 1

do
{
$NumOfNotepad--
# 배열에 저장된 프로세스 ID를 사용하여 메모장을 종료
Stop-Process -Id $PIDs[$NumOfNotepad]
}
until (0 -ge $NumOfNotepad)

# 배열의 모든 내용을 지움
$PIDs.Clear()


'ⓟrogramming > PowerShell' 카테고리의 다른 글

POWERSHELL SCRIPT - 개체 선택  (0) 2018.07.03
POWERSHELL SCRIPT - 스크립트 모듈  (0) 2018.06.29
POWERSHELL SCRIPT - 파워셸 범위  (0) 2018.06.28
POWERSHELL SCRIPT - 모듈화  (0) 2018.06.28
PowerShell Script - 변수  (0) 2018.06.26
블로그 이미지

뚱땡이 우주인

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


스크립트의 기능 문서화

'자세한 정보'를 특정 단계별로 출력하도록 내부 메시지를 보기 위해서는 명령을 실행할 때 -Verbose 스위치를 붙이면 된다.



Test-NetConnection -ComputerName www.microsoft.com -Verbose


Write-Verbose

Write-Verbose -Message "자세한 정보 표시"


위 명령은 대화식 실행과 같은 일부 시나리오에서만 적용하는 것이 좋으며 가능한 사용을 줄이는 것이 좋다. 스크립트의 실행 과 정에 정보를 표시하는 용도로 사용하라고 만들어 놓은 명령이다.


위 명령은 스크립트에서 제공하는 기능을 문서화하는데 이용할 수 있다.



function ConverTo-InchToMeter {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true)]
        [int]$Inch
    )
    BEGIN {
        #인치를 미터로 변환하는 개수
        $Const = 2.54
    }
    PROCESS {
        Write-Verbose -Message "변환할 인치 (in) : $Inch"
        Write-Verbose -Message "인치를 미터로 변환합니다."
        $result = ($Inch * $Const) / 100
        Write-Verbose -Message "변환 결과 (m) : $result"
    }
    End {

    }
}


# 결과
PS> ConverTo-InchToMeter -Inch 30 -verbose
자세한 정보 표시: 변환할 인치 (in) : 30
자세한 정보 표시: 인치를 미터로 변환합니다.
자세한 정보 표시: 변환 결과 (m) : 0.762


주석 기반 도움말

function Get-SecurityEvents {
<#
.SYNOPSIS
컴퓨터의 보안에 로그 대한 감사 정보를 가져온다.
.DESCRIPTION
이벤트 뷰어의 Windows 로그아래에서 보안 감사 로그를 대상으로 한다.
계정 로그인/로그오프 등의 감사 로그 내용을 가져온다.
.PARAMETER ComputerName
로그를 가져올 컴퓨터의 이름.
.PARAMETER EventID
보안 로그에서 원하는 이벤트의 ID.
.EXAMPLE
Get-SecurityEvents -ComputerName MyComputer
.EXAMPLE
Get-SecurityEvents -ComputerName MyComputer -EventID 4634
.EXAMPLE
Get-SecurityEvents -ComputerName MyComputer -EventID 4634 -Verbose
#>

    [CmdletBinding()]
    Param(
        [Parameter(Position=0,Mandatory=$True)]
        [string]$ComputerName,

        [int]$EventID = 4634
    )
BEGIN
{
Write-Verbose -Message "로그 이름을 입력 받는다."
$LogName = Read-Host "로그 이름을 입력하세요."
}
PROCESS
{
Write-Verbose -Message "'$ComputerName'에서 '$LogName'로그를 가져온다."
Get-EventLog -ComputerName $ComputerName `
-LogName $LogName |
     Where-Object -Property EventID -eq $EventID |
     Select-Object -First 7
}
    END {}
}


  • <# ~ #> : 주석 블록 표시
  • .SYNOPSIS : 주석의 줄거리
  • .DESCRIPTION : 함수나 스크립트의 기능에 대한 자세한 설명
  • .PARAMETER : 함수나 스크립트에서 사용하는 매개변수 정보. 매개변수 개수만큼 반복
  • .EXAMPLE : 사용 방법에 대한 예제. 예제 개수만큼 반복한다.


Get-Help Get-SecurityExample -detailed


Send-OutllokMail에 도움말과 자세한 정보 추가하기

function Send-OutlookMail{
<#
.SYNOPSIS
Outlook.com의 SMTP를 이용해 메일을 발송한다.
.DESCRIPTION
Outlook.com 서비스에서 제공하는 SMTP를 이용해 PowerShell에서 메일을 보낼 수 있다.
SMTP 서버는 ‘smtp.live.com’이며 포트는 587이다.
이 기능은 Microsoft의 계정이 필요하다.
.PARAMETER From
보내는 사람
.PARAMETER To
받는 사람
.PARAMETER Cc
참조 수신자
.PARAMETER Subject
메일 제목
.PARAMETER Body
메일 본문 내용
.EXAMPLE
Send-OutlookMail -To recipient@anymail.com -Subject “메일 제목” -Body “메일 본문”
.EXAMPLE
Send-OutlookMail -From sender@outlook.com -To recipient@anymail.com
-Subject “메일 제목” -Body “메일 본문”
.EXAMPLE
Send-OutlookMail -From sender@outlook.com -To recipient@anymail.com
-Subject “메일 제목” -Body “메일 본문” -Verbose
#>

[CmdletBinding()]
Param(
     [Parameter(Mandatory=$False)]
[string] $From = "김도균 <kimdokyun@outlook.com>",
     [Parameter(Mandatory=$True)]
[string] $To,
[Parameter(Mandatory=$False)]
[string] $Cc = "steelflea@outlook.com",
[Parameter(Mandatory=$True)]
[string] $Subject,
[Parameter(Mandatory=$False)]
[string] $Body = "PowerShell에서 보낸 메일"
)
BEGIN
{
Write-Verbose "Outlook.com의 자격증명을 입력 받는다."
$Cred = (Get-Credential)
$SmtpSvr=“smtp.live.com
$SmtpPort="587"
}
PROCESS
{
Write-Verbose "'$To'에게 '$Subject'제목의 메일을 발송한다."
Send-MailMessage -From $From -To $To -Cc $Cc -Subject $Subject `
-Body $Body -SmtpServer $SmtpSvr -Port $SmtpPort -UseSsl `
-Credential $Cred -Encoding UTF8
}
END
{
Write-Verbose "저장된 자격증명을 지운다."
Clear-Variable -Name Cred
}
}


블로그 이미지

뚱땡이 우주인

,