모든 것을 당신에 대해 알고 싶어하는 경우 성명

  • 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미만
  • -iltless 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바이너리지 않
    • -shlshift left
    • -shrshift 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가치를 평가하는$falseif문입니다., 특히$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를 확인하여 파일임을 확인합니다. 우리가 파일을 찾으면 우리는 그것을 움직입니다. 그렇지 않으면 경고를 작성합니다., 이 유형의 분기 논리는 매우 일반적입니다.

    중첩된 경우

    ifelse문을 스크립트를 차단할 수 있도록 우리는 어떤 PowerShell 명령 insidethem 포함하여 다른if문입니다. 이렇게하면 훨씬 더 복잡한 논리를 사용할 수 있습니다.

    이 예에서는 행복한 경로를 먼저 테스트 한 다음 조치를 취합니다. 실패하면 우리는다른 확인을하고 사용자에게 더 자세한 정보를 제공합니다.

    elseif

    우리는 단지 하나의 조건부 검사에만 국한되지 않습니다., 우리는 체인ifelsestatementstogether 는 대신 그들을 중첩하여 사용하는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 의 근본적인 부분입니다. 당신은 당신이 쓰는 거의 모든 스크립트에서 이것을 여러 번 사용하여 자신을 발견 할 것입니다. 나는 당신이 전에 가지고 있었던 것보다 더 나은 것을 가지고 있기를 바랍니다.피>

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다