- 05/23/2020
- 18 분 읽
-
- j
- x
- t
- D
좋아하는 많은 다른 언어,PowerShell 는 문의에 대한 조건에 따라 코드를 실행하에 yourscripts. 그 진술 중 하나는 If 문입니다., 오늘 우리는 다음 중 하나에 깊은 다이빙을 할 것입니다.PowerShell 에서 가장 근본적인 명령.
참고
이 기사의 원본 버전은@KevinMarquette 가 작성한 블로그에 나타났습니다. ThePowerShell 팀은이 콘텐츠를 우리와 공유해 주신 Kevin 에게 감사드립니다. 을 확인하시기 바랍니 그의 블로그 atPowerShellExplained.com.
if
스크립트를 자주 확인해야 결정 및 수행 다른 논리에 기반한 의사 결정.이것은 내가 조건부 실행을 의미하는 것입니다., 평가할 하나의 명령문이나 값이 있습니다.해당 평가를 기반으로 다른 코드 섹션을 확인하십시오. 이것이 바로if
문이하는 일입니다.
if 문
여기에 기본적인 예의if
성명:
$condition = $trueif ( $condition ){ Write-Output "The condition was true"}
첫 번째 것은if
문지 평가하는 표현에 괄호 안에 표시됩니다. 중괄호에서$true
를 평가하면scriptblock
를 실행합니다., 값이$false
인 경우 해당 스크립트 블록을 건너 뜁니다.
이전 예에서if
문은 단지$condition
변수를 평가하고있었습니다. 그것은$true
였고 scriptblock 내부에서Write-Output
명령을 실행했을 것입니다.
일부 언어에서는if
문 뒤에 한 줄의 코드를 배치 할 수 있습니다. PowerShell 의 경우는 그렇지 않습니다. 올바르게 작동하려면 중괄호가있는 전체scriptblock
를 제공해야합니다.,
비교 연산자
가장 일반적인 사용하의if
문은 비교하는 두 개의 항목을 가진다. PowerShell 은다른 비교 시나리오에 대한 특수 연산자. 비교 연산자를 사용하면 값왼쪽에있는 값은 오른쪽에있는 값과 비교됩니다.
-eq for equality
-eq
는 두 값 사이의 평등을 검사하여 서로 동일한 지 확인합니다.,
$value = Get-MysteryValueif ( 5 -eq $value ){ # do something}
이 예에서 나는 알려진 값의5
과 비교하는 내$value
경 theymatch.
한 가지 가능한 사용 사례는 값에 대한 조치를 취하기 전에 값의 상태를 확인하는 것입니다. 서비스를 가져 와서Restart-Service
를 호출하기 전에 상태가 실행 중인지 확인할 수 있습니다.
이것은 일반적인에서 다른 언어 같은 C#을 사용하는==
에 대한 평등에(예:5 == $value
)그러나지 않는 ‘twork PowerShell., 다른 일반적인 실수를 하는 사람들이 사용하는 등호(예:5 = $value
)을 위해 마련된 값을 할당하는 변수입니다. 당신의 알려진 값을 theleft 에 배치함으로써,그것은 그 실수를 더 어색하게 만듭니다.
이 연산자(및 기타)에는 몇 가지 변형이 있습니다.,
-
-eq
대소문자를 구분하는 평등 -
-ieq
대소문자를 구분하는 평등 -
-ceq
경우 민감한 평등
-ne 같지 않
많은 운영자가 관련 운영자는 검사에 대한 반대의 결과입니다. -ne
는 값이 서로 같지 않음을 확인합니다.
if ( 5 -ne $value ){ # do something}
이용하는 것을 확인하는 작업만 실행하는 경우에는 값 없5
., 좋은 유스 케이스당신이 그것을 시작하려고하기 전에 서비스가 실행 상태에 있었는지 확인해야합니다.
변:
-
-ne
대소문자를 구분하지 않 같 -
-ine
대소문자를 구분하지 않 같 -
-cne
경우 민감한 같지 않
이들은 반대의 변형-eq
. Variationsfor 다른 연산자를 나열 할 때 이러한 유형을 함께 그룹화합니다.,
-gt-ge-lt-le for 거
이 연산자를 확인할 때 사용하시는 경우 값보다 크거나 작은 또 다른 값입니다.이 문제를 해결하려면 다음 단계를 따르고 싶습니다.,먹는 사람보다 작거나 같은,대/소문자를 구분
-cge
보다 크거나 같은,대소문자를 구분-lt
미만-ilt
less than 대소문자를 구분-clt
미만,대소문자를 구분-le
보다 작거나 같-ile
작거나 같음, 대소문자를 구분-cle
작거나 같음,대소문자를 구분난 몰라 왜 당신이 사용하는 것이 대소문자를 구분하고 문자를 구분에 대한 옵션을 이 연산자입니다.,
-같이 와일드카드 경기
PowerShell 는 그것의 자신의 와일드카드를 기반으로 패턴 일치하는 구문을 사용할 수 있습으로-like
연산자입니다. 이러한 와일드 카드 패턴은 상당히 기본입니다.
-
?
경기는 어떤 하나의 문자 -
*
과 일치하는 번호로 문자
$value = 'S-ATX-SQL01'if ( $value -like 'S-*-SQL??'){ # do something}
는 것이 중요하다는 것을 지적한 패턴과 일치하는 전자 문자열입니다. 문자열의 중간에 일치해야하는 경우 thestring 의 양쪽 끝에*
를 배치해야합니다.,e”>
변:
-
-like
대소문자를 구분하는 와일드카드 -
-ilike
대소문자를 구분하는 와일드카드 -
-clike
경우 와일드카드 -
-notlike
대소문자를 구분하는 와일드카드 일치하지 않 -
-inotlike
대소문자를 구분하는 와일드카드 일치하지 않 -
-cnotlike
경우 와일드카드 일치하지 않
-일치 정규식
-match
연산자를 확인할 수 있습니다 문자열에 대한 정기적 표현의 기반이 일치합니다., 와일드 카드 패턴이 당신을 위해 충분히 유연하지 않을 때 이것을 사용하십시오.
$value = 'S-ATX-SQL01'if ( $value -match 'S-\w\w\w-SQL\d\d'){ # do something}
정규식 패턴은 기본적으로 문자열의 아무 곳이나 일치합니다. 할 수 있도록 지정한 하위 문자열이 나올려는 일치하는 다음과 같다:
$value = 'S-ATX-SQL01'if ( $value -match 'SQL'){ # do something}
정규식은 복잡한 언어 자신의 가치가 있다. 나는-match
에 대해 더 많이 이야기하고다른 기사에서 정규식을 사용하는 많은 방법.,
Variations:
-
-match
case-insensitive regex -
-imatch
case-insensitive regex -
-cmatch
case-sensitive regex -
-notmatch
case-insensitive regex not matched -
-inotmatch
case-insensitive regex not matched -
-cnotmatch
case-sensitive regex not matched
-is of type
You can check a value’s type with the -is
operator.,
if ( $value -is ){ # do something}
사용할 수 있는 이와 작업하는 경우스 클래스 또는 받아들이 다양한 개체를 통해 파이프 라인에 있습니다. 서비스 또는 서비스 이름을 입력으로 가져야합니다. 그런 다음 서비스가 있는지 확인하십시오.이름 만 있으면 서비스를 가져옵니다.,
if ( $Service -isnot ){ $Service = Get-Service -Name $Service}
변화:
-
-is
의 유형 -
-isnot
지의 유형
컬렉션 사업자
사용하는 경우 이전의 사업자는 단일 값 결과는$true
또는$false
. 이것은컬렉션으로 작업 할 때 약간 다르게 취급됩니다. 컬렉션의 각 항목은 평가되고 연산자는$true
로 평가되는 모든 값을 반환합니다.,
PS> 1,2,3,4 -eq 33
이것은 여전히if
문에서 올바르게 작동합니다. 따라서 연산자에 의해 값이 반환 된 다음 thewhole 문은$true
입니다.
$array = 1..6if ( $array -gt 3 ){ # do something}
여기서 지적해야 할 세부 사항에 숨어있는 작은 함정이 하나 있습니다. 이 방법으로-ne
연산자를 사용하면 실수로 논리를 거꾸로 보는 것이 쉽습니다. 를 사용하는-ne
으로 컬렉션을 반환하는$true
경우 모든 항목에서 컬렉션이 일치하지 않는 당신의 값입니다.,
PS> 1,2,3 -ne 4123
이처럼 보일 수 있습니다 영리한 속임수,그러나 우리는 작업자들을-contains
및-in
을 처리하는 이 moreefficiently. 그리고-notcontains
는 당신이 기대하는 것을 수행합니다.
–
-contains
연산자는 컬렉션에 값을 확인합니다. 일치하는 항목을 찾 자마자$true
를 반환합니다.
$array = 1..6if ( $array -contains 3 ){ # do something}
이것은 컬렉션에 값이 포함되어 있는지 확인하는 데 선호되는 방법입니다., 를 사용하는Where-Object
(또는-eq
)산책과 전체 목록은 모든 시간은 크게 느립니다.,
변:
-
-contains
대소문자를 구분 경기 -
-icontains
대소문자를 구분 경기 -
-ccontains
경우 민감한 경기 -
-notcontains
대소문자를 구분 일치하지 않 -
-inotcontains
대소문자를 구분 일치하지 않 -
-cnotcontains
경우 민감과 일치하지 않
-in
-in
운영자 이처럼-contains
연산자를 제외한 컬렉션은 오른쪽에된 handside.,
$array = 1..6if ( 3 -in $array ){ # do something}
Variations:
-
-in
case-insensitive match -
-iin
case-insensitive match -
-cin
case-sensitive match -
-notin
case-insensitive not matched -
-inotin
case-insensitive not matched -
-cnotin
case-sensitive not matched
Logical operators
Logical operators are used to invert or combine other expressions.,
-아
-not
연산자를 뒤집에서 식$false
을$true
또는$true
을$false
. 여기서Test-Path
가$false
일 때 작업을 수행하려는 예입니다.
if ( -not ( Test-Path -Path $path ) )
사업자의 대부분은 우리에 대해 이야기가 있는 변화가 당신을 사용하지 않는-not
연산자입니다. 그러나 여전히 유용 할 때가 있습니다.
!, 연산자
!
를-not
의 별칭으로 사용할 수 있습니다.
if ( -not $value ){}if ( !$value ){}
당신이 볼 수있는!
사용되는 더 많은 사람들에 의해서 오는 다른 언어로 다음과 같습니다. 내 스크립트를 빠르게 볼 때보기가 어렵 기 때문에 itout 을 입력하는 것을 선호합니다.
-및
표현식을-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 독점 또는
이 하나는 조금 특이합니다. -xor
는 하나의 표현식 만$true
로 평가할 수 있습니다., 그렇다면 bothitems 은$false
또는 두 항목은$true
,다음 전체 식$false
. 이것에서 tolook 하는 또 다른 방법은 표현식의 결과가 다른 경우에만$true
입니다.
누구나이 논리 연산자를 사용하는 경우는 드뭅니다.
비트 연산자
비트 연산자에 대한 계산을 수행 비트에 값을 생산하고 새로운 값으로 결과는., 비트 연산자를 가르치는 것은이 기사의 범위를 벗어나지 만 여기에 목록이 있습니다.
-
-band
바이너리고 -
-bor
진 또는 -
-bxor
바이너리 배타적 또는 -
-bnot
바이너리지 않 -
-shl
shift left -
-shr
shift right
PowerShell 식
우리가 사용할 수 있는 정상 PowerShell 내부 상태 문입니다.,
if ( Test-Path -Path $Path )
Test-Path
반$true
또는$false
을 때 실행됩니다. 이것은 다른 값을 반환하는 명령에도 적용됩니다.
if ( Get-Process Notepad* )
그것을 평가하는$true
있는 경우에 반환되는 과정 그리고$false
이 있는 경우 ‘sn’thing., 그것은 ‘sperfectly 유효한 사용하는 파이프라인을 표현이나 다른 PowerShell 문 like this:
if ( Get-Process | Where Name -eq Notepad )
이러한 표현을 서로 결합될 수 있으로-and
및-or
연산자,하지만 당신은 mayhave 를 괄호를 사용하여 그들을 휴식으로 하위 식.
if ( (Get-Process) -and (Get-Service) )
에 대한 검사$null
는 결과가 없 또는$null
가치를 평가하는$false
if
문입니다., 특히$null
를 확인할 때 왼쪽에$null
를 배치하는 것이 가장 좋습니다.
if ( $null -eq $value )
꽤 많은 뉘앙스를 다룰 때는$null
값에 있습니다. 당신이 관심이 있다면더 깊은 다이빙,나는 당신이$null 에 대해 알고 싶었던 모든 것에 관한 기사를 가지고 있습니다.
변수 할당
Prasoon Karunan V 가 생각 나게 할 때까지 이것을 추가하는 것을 거의 잊었습니다.,
if ($process=Get-Process notepad -ErrorAction ignore) {$process} else {$false}
일반적으로 변수에 값을 할당하면 값이 파이프 라인 orconsole 에 전달되지 않습니다. 하위 표현식에서 변수 할당을 수행하면 파이프라인에 전달됩니다.
PS> $first = 1PS> ($second = 2)2
보는 방법을$first
할당은 출력되지 않고$second
할당합니까? if
문에서 assignmentis 가 수행되면 위의$second
할당과 마찬가지로 실행됩니다., 여기에 cleanexample 는 방법에 당신은 그것을 사용할 수 있었습니다:
if ( $process = Get-Process Notepad* ){ $process | Stop-Process}
경우$process
얻 값을 할당,다음의 문장은$true
및$process
가 정지됩니다.이것이 평등 검사가 아니기 때문에
이것을-eq
와 혼동하지 않도록하십시오. 이것은 대부분의 사람들이 이런 식으로 작동한다는 것을 깨닫지 못하는 moreobscure 기능입니다.,
대체 경로를 실행
if
문를 지정할 수 있는 행동하지 않는 경우에만 문장은$true
,butalso 에 대한 할 때 그것은$false
. 이것은else
문이 나오는 곳입니다.
else
else
명령문은 항상if
명령문의 마지막 부분입니다 사용될 때.
이 예에서는$path
를 확인하여 파일임을 확인합니다. 우리가 파일을 찾으면 우리는 그것을 움직입니다. 그렇지 않으면 경고를 작성합니다., 이 유형의 분기 논리는 매우 일반적입니다.
중첩된 경우
if
및else
문을 스크립트를 차단할 수 있도록 우리는 어떤 PowerShell 명령 insidethem 포함하여 다른if
문입니다. 이렇게하면 훨씬 더 복잡한 논리를 사용할 수 있습니다.
이 예에서는 행복한 경로를 먼저 테스트 한 다음 조치를 취합니다. 실패하면 우리는다른 확인을하고 사용자에게 더 자세한 정보를 제공합니다.
elseif
우리는 단지 하나의 조건부 검사에만 국한되지 않습니다., 우리는 체인if
및else
statementstogether 는 대신 그들을 중첩하여 사용하는elseif
문입니다.
실행은 위에서 아래로 발생합니다. 상위if
문이 먼저 평가됩니다. 면 입$false
,그것은 아래로 움직이 다음elseif
또는else
목록에 있습니다. 는 지난else
은 기본 행동을 취하지 않으면 다른 사람의 반환$true
.,
switch
이 시점에서switch
문을 언급해야합니다. 그것은 값을 가진 다중 비교를 수행하기위한 대체 구문을 제공합니다. switch
를 사용하면 표현식을 지정하고 그 결과는 여러 다른 값으로 getscompared 합니다. 해당 값 중 하나가 일치하면 일치하는 코드 블록은확실히. 을 살펴 이 예제:
$itemType = 'Role'switch ( $itemType ){ 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' }}
가는 세 가능한 값이 일치할 수 있는$itemType
. 이 경우Role
와 일치합니다., 간단한 예제를 사용하여switch
연산자에 대한 노출을 제공했습니다. 나는 당신이 이제까지 다른 기사에서 스위치 문에 관하여 알고 싶었던 모두에 관하여 더 많은 것을 이야기한다.
파이프 라인
파이프 라인은 PowerShell 의 독특하고 중요한 기능입니다. 변수에 할당 된 suppressedor 가 아닌 모든 값이 파이프 라인에 배치됩니다. if
는 항상 명확하지 않은 방식으로 파이프 라인을 유리하게 사용할 수있는 방법을 제공합니다.,
$discount = if ( $age -ge 55 ){ Get-SeniorDiscount}elseif ( $age -le 13 ){ Get-ChildDiscount}else{ 0.00}
각 스크립트 블록 배치되는 결과를 명령하거나 값으로 파이프 라인에 있습니다. 그런 다음if
명령문의 결과를$discount
변수에 할당합니다. 이 예제는 해당 값을 각 scriptblock 에서 직접$discount
변수에 쉽게 할당 할 수 있습니다. 내가 말할 수 없는 한 iuse 이와 함께if
문 종종았지만,예를 들어 내가 사용하는 이였습니다.,
배열 인라인
Invoke-SnowSql 이라는 함수가 있습니다.이 함수는 여러 명령 linearguments 로 실행 파일을 시작합니다. 여기에 내가 인수의 배열을 구축 해당 함수에서 클립입니다.
$Debug
및$Path
변수는 매개변수 함수에 의해 제공되는 최종 사용자에게 있습니다.나는 그것들을 내 배열의 초기화 안에 인라인으로 평가한다. $Debug
가 true 인 경우 해당 값은 올바른 위치에서$snowSqlParam
에 속합니다. $Path
변수에 대해서도 마찬가지입니다.,
복잡한 작업을 단순화하
이것은 피할 수 없는 상황으로 실행 하는 방법으로 너무 많은 비교 확인하고 당신의If
문 스크롤 방법으로 떨어져 오른쪽 화면입니다.
그들은 읽기 어려울 수 있습니다 그리고 그것은 당신이 실수를하는 경향이 더합니다. 그 점에 대해 wecan 이하는 몇 가지 일이 있습니다.
줄 연속
PowerShell 에서 다음 줄로 명령을 래핑 할 수있는 연산자가 있습니다., 이 logicaloperators-and
및-or
좋은 사업자를 사용하는 경우에 당신은 당신의 식 intomultiple 라인입니다.
거기에는 여전히 많은 일이 있지만 각 조각을 자체 라인에 배치하면 큰 차이가 있습니다.나는 일반적으로 두 개 이상의 비교를 얻거나 오른쪽으로 스크롤해야 할 때 이것을 사용합니다.논리 중 하나를 읽으십시오.
사전 계산 결과
if
문에서 해당 문을 가져 와서 결과 만 확인할 수 있습니다.이것은 이전 예제보다 훨씬 깨끗하다고 느낍니다., 당신은 또한 당신이 정말로 확인하고있는 것이 무엇인지 설명하는 다양한 이름을 사용할 수있는 기회가 주어집니다. 이것은 또한 예제입니다.불필요한 주석을 저장하는 자체 문서화 코드.
다중 if 문
우리는 이것을 여러 문으로 분해하여 한 번에 하나씩 확인할 수 있습니다. 이 경우 aflag 또는 추적 변수를 사용하여 결과를 결합합니다.플래그 논리가 올바르게 작동하도록 논리를 반전시켜야했습니다. 각 평가는 anindividualif
문입니다., 이것의 장점은 디버깅 할 때 논리가 무엇을하고 있는지 정확하게 말할 수 있다는 것입니다. 나는 동시에 훨씬 더 자세한 장황함을 더할 수 있었다.
명백한 단점은 작성하는 코드가 훨씬 더 많다는 것입니다. 코드를 살펴 보는 것이 더 복잡합니다.그것은 한 줄의 논리를 취하고 25 개 이상의 줄로 폭발시킵니다.
함수를 사용하여
모든 유효성 검사 논리를 함수로 이동할 수도 있습니다. 이것이 어글랜스에서 얼마나 깨끗하게 보이는지 살펴보십시오.,
if ( Test-SecureDriveConfiguration -ADUser $user ){ # do something}
당신은 여전히 만드는 함수하는지 검증하지만,그것은 이 코드는 많은 쉽게 해결하려면니다. 이 코드를 테스트하기가 더 쉽습니다. 테스트에서Test-ADDriveConfiguration
에 대한 호출을 조롱 할 수 있으며이 함수에 대한 두 가지 테스트 만 필요합니다. 이 매개 변수를 반환하는 방법은 다음과 같습니다. 다른 기능을 테스트하는 것이 더 간단하기 때문에작은.
몸의 기능을 수 있는 하나 줄 우리가 시작과 함께 또는 폭발 로직 그들은 진리를 버리 사용되는 마지막 부분에서., 이것은 두 시나리오 모두에서 잘 작동하며 나중에 thatimplementation 을 쉽게 변경할 수 있습니다.
오류 처리
하나의 중요한의 사용if
문를 확인에 대한 오류 조건을 실행하기 전에 intoerrors. 좋은 예는 폴더를 만들려고 시도하기 전에 폴더가 이미 있는지 확인하는 것입니다.예외가 발생할 것으로 예상되면 실제로 예외가 아니라고 말하고 싶습니다. 그래서 당신의 가치를 확인하고 당신이 할 수있는 조건을 검증하십시오.,
실제 예외 처리에 조금 더 뛰어 들기를 원한다면 예외에 대해 알고 싶었던 기사가 있습니다.
최종 단어
if
문은 간단한 문이지만 powershell 의 근본적인 부분입니다. 당신은 당신이 쓰는 거의 모든 스크립트에서 이것을 여러 번 사용하여 자신을 발견 할 것입니다. 나는 당신이 전에 가지고 있었던 것보다 더 나은 것을 가지고 있기를 바랍니다.피>