다른 많은 언어와 마찬가지로 PowerShell에는 스크립트에서 코드를 조건부로 실행하기 위한 문이 있습니다. 이러한 문 중 하나는 If 문입니다. 오늘 PowerShell에서 가장 기본적인 명령 중 하나를 자세히 살펴보겠습니다.
비고
이 문서의 원래 버전@KevinMarquette작성한 블로그에 나타났습니다. PowerShell 팀은 이 콘텐츠를 공유해 주신 Kevin에게 감사드립니다. PowerShellExplained.com자신의 블로그를 확인하세요.
조건부 실행
스크립트는 종종 의사 결정을 내리고 이러한 결정에 따라 다른 논리를 수행해야 합니다.
이것이 조건부 실행의 의미입니다. 평가할 문이나 값이 하나 있는 경우 해당 평가에 따라 다른 코드 섹션을 실행합니다. 이것이 바로 if
문이 수행하는 작업입니다.
if
선언문
다음은 if
문의 기본 예시입니다.
$condition = $true
if ( $condition )
{
Write-Output "The condition was true"
}
if
문의 첫 번째 작업은 괄호 안의 식을 평가하는 것입니다.
$true
로 평가되면 중괄호 안에서 scriptblock
을 실행합니다. 값이 $false
경우 해당 scriptblock을 건너뜁니다.
이전 예제에서 if
문은 $condition
변수만 평가했습니다.
$true
였고 스크립트 블록 내에서 Write-Output
명령이 실행되었을 것입니다.
일부 언어에서는 if
문 뒤의 코드 한 줄을 배치하여 실행할 수 있습니다. PowerShell에서는 그렇지 않습니다. 제대로 작동하려면 중괄호가 포함된 전체 scriptblock
를 제공해야 합니다.
비교 연산자
if
문 구문의 가장 일반적인 용도는 두 항목을 서로 비교하는 것입니다. PowerShell에는 다양한 비교 시나리오에 대한 특수 연산자가 있습니다. 비교 연산자를 사용하는 경우 왼쪽의 값이 오른쪽의 값과 비교됩니다.
-eq는 동등성을 체크합니다.
-eq
두 값 간에 같음 검사를 수행하여 서로 같은지 확인합니다.
$value = Get-MysteryValue
if ( 5 -eq $value )
{
# do something
}
이 예제에서는 알려진 5
값을 가져와서 $value
비교하여 일치하는지 확인합니다.
가능한 사용 사례 중 하나는 값에 대한 작업을 수행하기 전에 값의 상태를 확인하는 것입니다. 서비스를 가져와서 Restart-Service
호출하기 전에 상태가 실행 중인지 확인할 수 있습니다.
C#과 같은 다른 언어에서는 같음(예: 5 == $value
)을 위해 ==
사용하는 것이 일반적이지만 PowerShell에서는 작동하지 않습니다. 다른 일반적인 실수는 변수에 값을 할당하기 위해 예약된 등호(예: 5 = $value
)를 사용하는 것입니다. 알려진 값을 왼쪽에 배치하면 실수가 더 어색해집니다.
이 연산자(및 기타)에는 몇 가지 변형이 있습니다.
-
-eq
대/소문자를 구분하지 않는 동등성 - 대/소문자를 구분하지 않는 같음
-ieq
- 대소문자 구분 일치
-ceq
-ne 같지 않음
많은 연산자에는 반대 결과를 확인하는 관련 연산자가 있습니다.
-ne
값이 서로 같지 않은지 확인합니다.
if ( 5 -ne $value )
{
# do something
}
이 값을 사용하여 값이 5
않은 경우에만 작업이 실행되는지 확인합니다. 서비스를 시작하기 전에 서비스가 실행 중 상태인지 확인하는 좋은 사용 사례입니다.
변형:
- 대/소문자를 구분하지 않는 경우
-ne
는 같지 않음 - 대/소문자를 구분하지 않는 불일치
-ine
- 대/소문자를 구분하는
-cne
같지 않음
이는 -eq
역 변형입니다. 다른 연산자용 변형을 나열할 때 이러한 형식을 그룹화합니다.
-gt -ge -lt -le 보다 크거나 작음
이러한 연산자는 값이 다른 값보다 크거나 작은지 확인할 때 사용됩니다.
이 -gt -ge -lt -le
은 GreaterThan, GreaterThanOrEqual, LessThan, 및 LessThanOrEqual을 나타냅니다.
if ( $value -gt 5 )
{
# do something
}
변형:
-
-gt
보다 큽니다 -
-igt
가 대/소문자를 구분하지 않고 더 크다 - 대/소문자 구분을 포함하여
-cgt
보다 큰 -
-ge
크거나 같음 - 대/소문자를 구분하지 않는
-ige
크거나 같음 -
-cge
크거나 같음, 대/소문자 구분 -
-lt
미만 - 대/소문자를 구분하지 않고
-ilt
보다 작음 -
-clt
대/소문자 구분보다 작음 -
-le
작거나 같음 -
-ile
작거나 같음, 대소문자 구분 없음 - 대/소문자 구분에서
-cle
이 작거나 같은
왜 이러한 연산자에서 대소문자 구분 옵션과 구분하지 않는 옵션을 사용하는지 모르겠습니다.
-like 와일드카드와 유사한 일치
PowerShell에는 고유한 와일드카드 기반 패턴 일치 구문이 있으며 -like
연산자와 함께 사용할 수 있습니다. 이러한 와일드카드 패턴은 매우 기본적입니다.
-
?
모든 단일 문자와 일치합니다. -
*
임의의 수의 문자와 일치합니다.
$value = 'S-ATX-SQL01'
if ( $value -like 'S-*-SQL??')
{
# do something
}
패턴이 전체 문자열과 일치한다는 점을 지적하는 것이 중요합니다. 문자열 중간에 있는 항목과 일치해야 하는 경우 문자열의 양쪽 끝에 *
배치해야 합니다.
$value = 'S-ATX-SQL02'
if ( $value -like '*SQL*')
{
# do something
}
변형:
- 대/소문자를 구분하지 않는 와일드카드
-like
- 대/소문자를 구분하지 않는 와일드카드
-ilike
- 대/소문자를 구분하는 와일드카드
-clike
-
-notlike
대/소문자를 구분하지 않는 와일드카드가 일치하지 않음 -
-inotlike
대/소문자를 구분하지 않고 와일드카드가 일치하지 않음 -
-cnotlike
대/소문자 구분 와일드카드가 일치하지 않음
-정규 표현식 매칭
-match
연산자를 사용하면 정규식 기반 일치 항목에 대한 문자열을 확인할 수 있습니다. 와일드카드 패턴이 충분히 유연하지 않은 경우 이를 사용합니다.
$value = 'S-ATX-SQL01'
if ( $value -match 'S-\w\w\w-SQL\d\d')
{
# do something
}
regex 패턴은 기본적으로 문자열의 아무 곳이나 일치합니다. 따라서 다음과 같이 일치시킬 부분 문자열을 지정할 수 있습니다.
$value = 'S-ATX-SQL01'
if ( $value -match 'SQL')
{
# do something
}
Regex는 고유한 복잡한 언어이며 살펴볼 가치가 있습니다.
-match
에 대해 더 자세히 이야기하고 regex 를 사용하는 여러 가지 방법을 다른 문서에서에 대해 설명합니다.
변형:
-
-match
대/소문자를 구분하지 않는 정규식 -
-imatch
대/소문자를 구분하지 않는 정규식 - 대/소문자 구분 정규식
-cmatch
- 대소문자를 구분하지 않는
-notmatch
regex가 일치하지 않음 - 대/소문자를 구분하지 않는 정규식이 일치하지 않음
-inotmatch
- 대/소문자를 구분하는
-cnotmatch
regex가 일치하지 않음
-유형이다
-is
연산자를 사용하여 값의 형식을 확인할 수 있습니다.
if ( $value -is [string] )
{
# do something
}
클래스를 사용하거나 파이프라인을 통해 다양한 개체를 수락하는 경우 이를 사용할 수 있습니다. 서비스 또는 서비스 이름을 입력으로 사용할 수 있습니다. 그런 다음, 서비스가 있는지 확인하고, 이름만 있는 경우 서비스를 가져옵니다.
if ( $Service -isnot [System.ServiceProcess.ServiceController] )
{
$Service = Get-Service -Name $Service
}
변형:
- 형식
-is
- "
-isnot
형식이 아님"
컬렉션 연산자
이전 연산자를 단일 값으로 사용하면 결과가 $true
또는 $false
. 컬렉션으로 작업할 경우 약간 다르게 처리됩니다. 컬렉션의 각 항목이 평가되고 연산자는 $true
로 평가되는 모든 값을 반환합니다.
PS> 1,2,3,4 -eq 3
3
이것은 if
명령문에서 여전히 올바르게 작동합니다. 따라서 연산자가 값을 반환하면 전체 문이 $true
가 됩니다.
$array = 1..6
if ( $array -gt 3 )
{
# do something
}
세부 사항에 숨어 있는 하나의 작은 함정을 지적하고자 합니다. 이렇게 -ne
연산자를 사용할 때, 논리를 거꾸로 해석하기 쉬운 점을 주의해야 합니다. 컬렉션에 -ne
사용하면 컬렉션의 항목이 값과 일치하지 않으면 $true
반환됩니다.
PS> 1,2,3 -ne 4
1
2
3
이것은 영리한 트릭처럼 보일 수 있지만 이를 보다 효율적으로 처리하는 연산자와 -contains
-in
있습니다. 그리고 -notcontains
당신이 기대하는 것을합니다.
포함하다
-contains
연산자는 컬렉션에서 값을 확인합니다. 일치 항목을 찾자마자 $true
반환됩니다.
$array = 1..6
if ( $array -contains 3 )
{
# do something
}
컬렉션에 값이 포함되어 있는지 확인하는 데 선호되는 방법입니다.
Where-Object
(또는 -eq
)를 사용하면 매번 전체 목록을 탐색할 수 있으며 훨씬 느립니다.
변형:
-
-contains
대/소문자를 구분하지 않는 일치 - 대/소문자를 구분하지 않는 일치
-icontains
- 대/소문자 구분 일치
-ccontains
-
-notcontains
가 대소문자를 구분하지 않고 일치하지 않음 - 대/소문자를 구분하지 않는
-inotcontains
가 일치하지 않음 - 대/소문자 구분이 일치하지 않음
-cnotcontains
-in
-in
연산자는 컬렉션이 오른쪽에 있다는 점을 제외하고 -contains
연산자처럼 표시됩니다.
$array = 1..6
if ( 3 -in $array )
{
# do something
}
변형:
- 대/소문자를 구분하지 않는 일치
-in
-
-iin
대/소문자를 구분하지 않는 일치 - 대/소문자 구분 일치
-cin
- 대소문자를 구분하지 않는
-notin
불일치 - 대/소문자를 구분하지 않는
-inotin
일치하지 않음 - 대/소문자 구분 불일치
-cnotin
논리 연산자
논리 연산자는 다른 식을 반전하거나 결합하는 데 사용됩니다.
-안
-not
연산자는 식을 $false
에서 $true
로 또는 $true
에서 $false
로 변환합니다. 다음은 Test-Path
$false
때 작업을 수행하려는 예제입니다.
if ( -not ( Test-Path -Path $path ) )
앞에서 설명한 대부분의 연산자에는 -not
연산자를 사용할 필요가 없는 변형이 있습니다. 그러나 여전히 유용할 때가 있습니다.
! 연산자
!
-not
별칭으로 사용할 수 있습니다.
if ( -not $value ){}
if ( !$value ){}
C#!
같은 다른 언어에서 온 사람들이 더 많이 사용하는 것을 볼 수 있습니다. 스크립트를 빠르게 볼 때 확인하기 어렵기 때문에 입력하는 것을 선호합니다.
-그리고
-and
연산자로 식을 결합할 수 있습니다. 이렇게 하면 전체 식이 $true
되기 위해서는 양측이 $true
돼야 합니다.
if ( ($age -gt 13) -and ($age -lt 55) )
이 예제에서 $age
왼쪽의 경우 13 이상, 오른쪽의 경우 55 미만이어야 합니다. 이 예제에서 더 명확하게 하기 위해 추가 괄호를 추가했지만 식이 간단한 한 선택 사항입니다. 다음은 이러한 예제가 없는 동일한 예제입니다.
if ( $age -gt 13 -and $age -lt 55 )
평가는 왼쪽에서 오른쪽으로 발생합니다. 첫 번째 항목이 $false
평가되면 일찍 종료되고 올바른 비교를 수행하지 않습니다. 이는 값을 사용하기 전에 존재하는지 확인해야 하는 경우에 편리합니다. 예를 들어 Test-Path
에 $null
경로를 지정하면 오류가 발생합니다.
if ( $null -ne $path -and (Test-Path -Path $path) )
-또는
-or
두 식을 지정하고 둘 중 하나가 $true
경우 $true
반환할 수 있습니다.
if ( $age -le 13 -or $age -ge 55 )
-and
연산자처럼 평가는 왼쪽에서 오른쪽으로 발생합니다. 첫 번째 부분이 $true
일 경우 전체 문장은 $true
이 되고 나머지 식을 처리하지 않습니다.
또한 이러한 연산자에서 구문이 작동하는 방식을 기록해 둡다. 두 개의 별개의 식이 필요합니다. 나는 사용자가 자신의 실수를 깨닫지 못하고 이와 같은 일을 하려고 $value -eq 5 -or 6
하는 것을 보았다.
-xor exclusive 또는
이것은 조금 특이합니다.
-xor
은(는) 오직 하나의 식만 $true
로 평가될 수 있도록 허용합니다. 따라서 두 항목이 모두 $false
또는 두 항목이 모두 $true
경우 전체 식이 $false
. 이를 바라보는 또 다른 방법은 표현식의 결과가 다를 때만 그 표현식이 $true
이라는 것입니다.
누구든지이 논리 연산자를 사용하는 것은 드물며 왜 그것을 사용하는지 에 대한 좋은 예를 생각할 수 없습니다.
비트 연산자
비트 연산자는 값 내의 비트에 대해 계산을 수행하고 결과로 새 값을 생성합니다. 비트 연산자 교육은 이 문서의 범위를 벗어나지만 여기에 나열된 목록이 있습니다.
-
-band
이진 AND - 이진 OR 연산
-bor
-
-bxor
이진 전용 OR -
-bnot
이진 NOT -
-shl
왼쪽 시프트 - 오른쪽으로
-shr
이동
PowerShell 식
조건문 내에서 일반 PowerShell을 사용할 수 있습니다.
if ( Test-Path -Path $Path )
Test-Path
실행 시 $true
또는 $false
반환합니다. 이는 다른 값을 반환하는 명령에도 적용됩니다.
if ( Get-Process Notepad* )
반환된 프로세스가 있는 경우에는 $true
으로 평가되고, 없는 경우에는 $false
으로 평가됩니다. 파이프라인 식 또는 다음과 같은 다른 PowerShell 문을 사용하는 것은 완벽하게 유효합니다.
if ( Get-Process | where Name -EQ Notepad )
이러한 식은 -and
및 -or
연산자와 함께 결합될 수 있지만 괄호를 사용하여 하위 식으로 구분해야 할 수 있습니다.
if ( (Get-Process) -and (Get-Service) )
$null 값 확인
결과가 없거나 $null
값일 경우, if
문에서는 이것이 $false
로 평가됩니다. 특히 $null
확인할 때 왼쪽에 $null
배치하는 것이 가장 좋습니다.
if ( $null -eq $value )
PowerShell에서 $null
값을 처리할 때는 몇 가지 미묘한 차이가 있습니다. 당신이 더 깊은 다이빙에 관심이 있다면, 나는 당신이 $null 대해 알고 싶은 모든 것을대한 기사가 있습니다.
조건 내의 변수 할당
이 하나를 추가하는 것을 거의 잊을 뻔했는데, 프라순 카루난 V이 그것을 상기시켜줄 때까지 기억하지 못했다.
if ($process=Get-Process notepad -ErrorAction Ignore) {$process} else {$false}
일반적으로 변수에 값을 할당하면 값이 파이프라인 또는 콘솔에 전달되지 않습니다. 하위 식에서 변수 할당을 수행하면 파이프라인에 전달됩니다.
PS> $first = 1
PS> ($second = 2)
2
$first
할당은 출력이 없고 $second
할당에는 출력이 있는 것을 확인하세요.
if
문에서 할당이 완료되면 위의 $second
할당과 마찬가지로 실행됩니다. 다음은 사용할 수 있는 방법에 대한 정리된 예제입니다.
if ( $process = Get-Process Notepad* )
{
$process | Stop-Process
}
$process
에 값이 할당되면, 문장은 $true
이며, $process
가 중지됩니다.
일치 검사 때문이 아니므로 이 내용을 -eq
과 혼동하지 않도록 주의하세요. 이것은 대부분의 사람들이 이런 식으로 작동한다는 것을 깨닫지 못하는 더 모호한 기능입니다.
scriptblock에서 변수 할당
if
문 scriptblock을 사용하여 변수에 값을 할당할 수도 있습니다.
$discount = if ( $age -ge 55 )
{
Get-SeniorDiscount
}
elseif ( $age -le 13 )
{
Get-ChildDiscount
}
else
{
0.00
}
각 스크립트 블록은 명령의 결과 또는 값을 출력으로 작성합니다.
if
문의 결과를 $discount
변수에 할당할 수 있습니다. 이 예제에서는 각 scriptblock에서 직접 해당 값을 $discount
변수에 쉽게 할당할 수 있습니다. 나는 이것을 if
문과 함께 자주 사용한다고 말할 수는 없지만 최근에 이것을 사용한 예가 있습니다.
대체 실행 경로
if
문을 사용하면 문이 $true
때뿐만 아니라 $false
때에도 작업을 지정할 수 있습니다. 이것이 바로 else
문이 시작되는 곳입니다.
그 밖에
else
문은 사용될 때 항상 if
문의 마지막 부분입니다.
if ( Test-Path -Path $Path -PathType Leaf )
{
Move-Item -Path $Path -Destination $archivePath
}
else
{
Write-Warning "$path doesn't exist or isn't a file."
}
이 예제에서는 $path
확인하여 파일인지 확인합니다. 파일을 찾으면 파일을 이동합니다. 그렇지 않은 경우 경고를 작성합니다. 이러한 유형의 분기 논리는 매우 일반적입니다.
중첩된 경우
if
및 else
문은 스크립트 블록을 필요로 하므로, 내부에 다른 if
문을 포함하여 어떤 PowerShell 명령도 배치할 수 있습니다. 이렇게 하면 훨씬 더 복잡한 논리를 사용할 수 있습니다.
if ( Test-Path -Path $Path -PathType Leaf )
{
Move-Item -Path $Path -Destination $archivePath
}
else
{
if ( Test-Path -Path $Path )
{
Write-Warning "A file was required but a directory was found instead."
}
else
{
Write-Warning "$path could not be found."
}
}
이 예제에서는 먼저 행복한 경로를 테스트한 다음 이에 대한 조치를 취합니다. 실패하면 다른 검사를 수행하고 사용자에게 더 자세한 정보를 제공합니다.
elseif (조건이 두 번째로 일치할 경우)
단 하나의 조건부 검사로만 제한되지 않습니다.
elseif
문장을 사용하여 if
문과 else
문장을 중첩하는 대신 연결할 수 있습니다.
if ( Test-Path -Path $Path -PathType Leaf )
{
Move-Item -Path $Path -Destination $archivePath
}
elseif ( Test-Path -Path $Path )
{
Write-Warning "A file was required but a directory was found instead."
}
else
{
Write-Warning "$path could not be found."
}
실행은 위에서 아래로 발생합니다. 최상위 if
명령문이 먼저 평가됩니다. 만약 그것이 $false
이면, 목록에서 다음 elseif
또는 else
로 이동합니다. 다른 모든 경우가 $true
을 반환하지 않는다면 마지막 else
이 기본적으로 수행되는 작업입니다.
스위치
이 시점에서 switch
문을 언급해야 합니다. 값과 여러 비교를 수행하기 위한 대체 구문을 제공합니다.
switch
식을 지정하면 결과가 여러 다른 값과 비교됩니다. 이러한 값 중 하나가 일치하면 일치하는 코드 블록이 실행됩니다. 이 예제를 살펴보세요.
$itemType = 'Role'
switch ( $itemType )
{
'Component'
{
'is a component'
}
'Role'
{
'is a role'
}
'Location'
{
'is a location'
}
}
$itemType
일치시킬 수 있는 세 가지 가능한 값이 있습니다. 이 경우, Role
와 일치합니다.
switch
연산자에 대한 노출을 제공하기 위해 간단한 예제를 사용했습니다. 나는 다른 기사에서 스위치 문에 대해 알고 싶었던 모든 것에 대해 더 많이 이야기합니다.
배열 인라인 방식
여러 명령줄 인수를 사용하여 실행 파일을 시작하는 Invoke-SnowSql 함수가 있습니다. 다음은 인수 배열을 작성하는 해당 함수의 클립입니다.
$snowSqlParam = @(
'--accountname', $Endpoint
'--username', $Credential.UserName
'--option', 'exit_on_error=true'
'--option', 'output_format=csv'
'--option', 'friendly=false'
'--option', 'timing=false'
if ($Debug)
{
'--option', 'log_level=DEBUG'
}
if ($Path)
{
'--filename', $Path
}
else
{
'--query', $singleLineQuery
}
)
$Debug
및 $Path
변수는 최종 사용자가 제공하는 함수의 매개 변수입니다.
제가 배열 초기화 내에서 인라인으로 그것들을 평가합니다.
$Debug
true이면 해당 값은 올바른 위치에 있는 $snowSqlParam
속합니다.
$Path
변수도 마찬가지입니다.
복잡한 작업 간소화
비교가 너무 많아 확인하는 것이 불가능한 상황에 부딪히는 것은 불가피하며, 이로 인해 if
문이 화면 오른쪽으로 길게 스크롤됩니다.
$user = Get-ADUser -Identity $UserName
if ( $null -ne $user -and $user.Department -eq 'Finance' -and $user.Title -match 'Senior' -and $user.HomeDrive -notlike '\\server\*' )
{
# Do Something
}
그것들은 읽기 어려울 수 있으며, 당신이 실수를 더 많이 할 가능성이 높아집니다. 우리가 그에 대해 할 수있는 몇 가지가 있습니다.
줄 연결
PowerShell에는 명령을 다음 줄로 래핑할 수 있는 일부 연산자가 있습니다.
-and
논리 연산자와 -or
식을 여러 줄로 나누려는 경우 사용하기에 좋은 연산자입니다.
if ($null -ne $user -and
$user.Department -eq 'Finance' -and
$user.Title -match 'Senior' -and
$user.HomeDrive -notlike '\\server\*'
)
{
# Do Something
}
아직 많은 일이 진행되고 있지만, 각 조각을 한 줄씩 배치하면 큰 차이를 느낄 수 있습니다. 일반적으로 두 개 이상의 비교를 받거나 논리를 읽기 위해 오른쪽으로 스크롤해야 하는 경우 이를 사용합니다.
사전 계산 결과
if
문에서 해당 문을 꺼내서 결과만 확인할 수 있습니다.
$needsSecureHomeDrive = $null -ne $user -and
$user.Department -eq 'Finance' -and
$user.Title -match 'Senior' -and
$user.HomeDrive -notlike '\\server\*'
if ( $needsSecureHomeDrive )
{
# Do Something
}
이것은 단지 이전 예제보다 훨씬 더 깨끗한 느낌. 또한 실제로 확인하는 내용을 설명하는 변수 이름을 사용할 수 있는 기회도 제공됩니다. 불필요한 주석을 저장하는 자체 문서화 코드의 예이기도 합니다.
여러 개의 조건문
이것을 여러 문장으로 나누고 한 번에 하나씩 확인할 수 있습니다. 이 경우 플래그 또는 추적 변수를 사용하여 결과를 결합합니다.
$skipUser = $false
if( $null -eq $user )
{
$skipUser = $true
}
if( $user.Department -ne 'Finance' )
{
Write-Verbose "isn't in Finance department"
$skipUser = $true
}
if( $user.Title -match 'Senior' )
{
Write-Verbose "Doesn't have Senior title"
$skipUser = $true
}
if( $user.HomeDrive -like '\\server\*' )
{
Write-Verbose "Home drive already configured"
$skipUser = $true
}
if ( -not $skipUser )
{
# do something
}
플래그 논리가 올바르게 작동하도록 논리를 반전해야 했습니다. 각 평가는 개별 if
문입니다. 이 장점은 디버깅할 때 논리가 수행하는 작업을 정확하게 알 수 있다는 것입니다. 나는 동시에 훨씬 더 나은 장황함을 추가할 수 있었다.
명백한 단점은 작성할 코드가 훨씬 더 많다는 것입니다. 코드는 한 줄의 논리를 사용하여 25개 이상의 줄로 분해되므로 더 복잡합니다.
함수 사용
모든 유효성 검사 논리를 함수로 이동할 수도 있습니다. 이렇게 깔끔해 보이는 걸 보세요.
if ( Test-SecureDriveConfiguration -ADUser $user )
{
# do something
}
유효성 검사를 수행하려면 함수를 만들어야 하지만 이 코드를 훨씬 쉽게 사용할 수 있습니다. 이 코드를 더 쉽게 테스트할 수 있습니다. 테스트에서는 Test-ADDriveConfiguration
호출을 모의할 수 있으며 이 함수에는 두 개의 테스트만 필요합니다. 하나는 $true
반환하고 다른 하나는 $false
반환합니다. 다른 함수는 너무 작기 때문에 테스트하는 것이 더 간단합니다.
해당 함수의 본문은 우리가 시작한 한 줄짜리 코드일 수도 있고, 마지막 섹션에서 사용한 세부적으로 풀어 쓴 논리일 수도 있습니다. 이는 두 시나리오 모두에 적합하며 나중에 해당 구현을 쉽게 변경할 수 있습니다.
오류 처리
if
문의 한 가지 중요한 사용은 오류가 발생하기 전에 오류 조건을 확인하는 것입니다. 좋은 예는 폴더를 만들기 전에 폴더가 이미 있는지 확인하는 것입니다.
if ( -not (Test-Path -Path $folder) )
{
New-Item -Type Directory -Path $folder
}
예외가 발생할 것으로 예상하는 경우 실제로 예외가 아니라고 말하고 싶습니다. 따라서 값을 확인하고 가능한 조건의 유효성을 검사합니다.
실제 예외 처리에 대해 좀 더 깊이 알고 싶다면, 예외에 대해 알고 싶었던 모든 것을 다룬 문서가 있습니다.
마지막 단어
if
문은 간단하지만 PowerShell의 기본 사항입니다. 작성하는 거의 모든 스크립트에서 이 작업을 여러 번 사용할 수 있습니다. 나는 당신이 이전보다 더 나은 이해를 바랍니다.
PowerShell