ifステートメントについて知りたかったすべて

  • 05/23/2020
  • 18分読む
    • j
    • x
    • T
    • d
    • s

他の多くの言語と同様に、powershellにはスクリプトで条件付きでコードを実行するためのステートメントがあります。 これらのステートメントの一つは、If文です。, 今日は、PowerShellの最も基本的なコマンド。

Note

この記事のオリジナルバージョンは、@KevinMarquetteによって書かれたブログに掲載されました。 ThePowerShellのチームは私達とこの内容を共有するためのケビンに感謝します。 彼のブログをご覧くださいatPowerShellExplained.com.

条件付き実行

あなたのスクリプトは、多くの場合、決定を下し、それらの決定に基づいて異なるロジックを実行する必要があります。これは私が条件付き実行によって意味するものです。, 評価するステートメントまたは値があり、その評価に基づいてコードの別のセクションを実行します。 これはまさにifステートメントが行うことです。

ifステートメント

ここでは、ifステートメントの基本的な例です。

$condition = $trueif ( $condition ){ Write-Output "The condition was true"}

ifステートメントが最初に行うことは、かっこ内の式を評価することです。 それがevaluatesto場合$true、それは実行しますscriptblock中括弧で。, 値が$falseの場合、そのスクリプトブロックをスキップします。

前の例では、ifステートメントは$condition変数を評価していました。 それは$trueであり、scriptblock内でWrite-Outputコマンドを実行しました。

一部の言語では、ifステートメントの後に一行のコードを配置することができます。 PowerShellではそうではありません。 正しく動作するには、完全なscriptblockを中かっこで指定する必要があります。,

比較演算子

ifステートメントの最も一般的な使用は、二つの項目を互いに比較することです。 PowerShellは、異なる比較シナリオのための特別な演算子。 比較演算子を使用すると、左側の値が右側の値と比較されます。

-等価性のためのeq

-eqは、二つの値が互いに等しいことを確認するために、等価性チェックを行います。,

$value = Get-MysteryValueif ( 5 -eq $value ){ # do something}

この例では、5の既知の値を取得し、それを私の$valueと比較して、一致するかどうかを確認します。

可能なユースケースの一つは、値に対してアクションを実行する前に値のステータスをチェックすることです。 サービスを取得し、Restart-Serviceを呼び出す前にステータスが実行されていることを確認できます。c#のような他の言語では、等価性のために==を使用するのが一般的です(例:5 == $value)が、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 greater than or less than

これらの演算子は、値が別の値より大きいか小さいかを確認するときに使用されます。-gt -ge -lt -leは、GreaterThan、GreaterThanOrEqual、LessThan、およびLessThanOrEqualを表します。,大文字小文字を区別しません

  • -cge大文字小文字を区別します
  • -ltより小さい
  • -iltより小さい、大文字小文字を区別しません
  • -cltより小さい、大文字小文字を区別しません
  • -cltより小さい
  • -le以下
  • -ile以下、大文字と小文字を区別しません
  • -cle以下、大文字と小文字を区別しません
  • これらのオプションで大文字と小文字を区別オペレーター。,

    -ワイルドカードのような一致

    PowerShellには独自のワイルドカードベースのパターンマッチング構文があり、-like演算子で使用できます。 これらのワイルドカードパター

    • ?任意の単一の文字に一致します
    • *任意の数の文字に一致します
    $value = 'S-ATX-SQL01'if ( $value -like 'S-*-SQL??'){ # do something}

    パターンが文字列全体に一致することを指摘することが重要です。 文字列の真ん中に何かを一致させる必要がある場合は、*を文字列の両端に配置する必要があります。,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}

    Regexは、独自の複雑な言語であり、調べる価値があります。 私は-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。 このishandled若干異なる場合、どのコレクションに納めるものです。 コレクション内の各項目はgetsevaluatedされ、演算子は評価されるすべての値を返します$true。,

    PS> 1,2,3,4 -eq 33

    これは、ifステートメントで正しく動作します。 したがって、演算子によって値が返されると、wholeステートメントは$trueです。

    $array = 1..6if ( $array -gt 3 ){ # do something}

    私が指摘する必要があるここの詳細に隠れている小さなトラップがあります。 このようにして-ne演算子を使用すると、誤ってロジックを後方に見るのは簡単です。 Acollectionで-neを使用すると、コレクション内のアイテムが値と一致しない場合は、$trueが返されます。,

    PS> 1,2,3 -ne 4123

    これは巧妙なトリックのように見えるかもしれませんが、演算子があります-containsそして-inこれ そして-notcontainsあなたが期待することをします。

    -contains

    -contains演算子は、コレクションに値がないかどうかをチェックします。 一致するものが見つかるとすぐに、$trueを返します。

    $array = 1..6if ( $array -contains 3 ){ # do something}

    これは、コレクションに値が含まれているかどうかを確認するための推奨される方法です。, Where-Object(または-eq)を使用すると、毎回リスト全体がウォークされ、大幅に遅くなります。,

    バリエーション:

    • -contains大文字と小文字を区別しない一致
    • -icontains大文字と小文字を区別しない一致
    • -ccontains大文字と小文字を区別しない一致
    • -notcontains大文字と小文字を区別しない一致
    • -notcontains一致した
    • -inotcontains大文字と小文字を区別しない一致しない
    • -cnotcontains大文字と小文字を区別しない一致しない

    -in

    -in演算子は、-contains演算子と同じです。コレクションは右側にあります。,

    $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

    -not演算子は、式を$falseから$trueまたは$trueから$falseに反転します。 以下は、Test-Path$falseのときにアクションを実行する例です。

    if ( -not ( Test-Path -Path $path ) )

    私たちが話した演算子のほとんどには、-not演算子を使用する必要がないバリエーションがあります。 しかし、それが有用である時はまだあります。

    !, operator

    !-notのエイリアスとして使用できます。

    if ( -not $value ){}if ( !$value ){}

    あなたが見るかもしれません!C#のような他の言語から来た人々によってより多く使用されています。 私はすぐに私のスクリプトを見るときに見るのが難しいので、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 exclusiveまたは

    これは少し珍しいです。 -xor一つの式のみが$trueに評価できます。, したがって、両方のアイテムが$falseまたは両方のアイテムが$true場合、式全体は$false。 これを見る別の方法は、式の結果が異なる場合、式は$trueのみです。

    誰もがこの論理演算子を使用することはまれであり、私はそれを使用することができないので、良い例を考えることはできません。

    ビットごとの演算子

    ビットごとの演算子は、値内のビットに対して計算を実行し、theresultとして新しい値を生成します。, ビットごとの演算子を教えることは、この記事の範囲を超えていますが、ここではリストthethemです。

    • -bandバイナリと
    • -borバイナリまたは
    • -bxorバイナリ排他または
    • -bnotバイナリではありません
    • -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値は$falseifステートメントで評価されます。, 特に$nullをチェックするときは、$nullを左側に配置することをお勧めします。

    if ( $null -eq $value )

    PowerShellで$null値を扱うときには、かなりのニュアンスがあります。 だinterestedinの水深にいたって-条約すべてを知りたいと思いドはnullになります。

    変数割り当て

    Prasoon Karunan Vが私に思い出させるまで、これを追加するのをほとんど忘れていました。,

    if ($process=Get-Process notepad -ErrorAction ignore) {$process} else {$false}

    通常、変数に値を割り当てると、その値はパイプラインまたはコンソールに渡されません。 サブ式で変数の割り当てを行うと、それはthepipelineに渡されます。

    PS> $first = 1PS> ($second = 2)2

    $first割り当てには出力がなく、$second割り当てはどうなりますか? 割り当てがifステートメントで行われると、上記の$second割り当てと同じように実行されます。, どのように使用できるかについてのcleanexampleは次のとおりです。

    if ( $process = Get-Process Notepad* ){ $process | Stop-Process}

    $process値が割り当てられた場合、ステートメントは$trueおよび$process停止します。

    これを-eqこれは等価性チェックではないため、これを混同しないようにしてください。 これは、ほとんどの人がこのように動作することを認識していないmoreeobscure機能です。,

    代替実行パス

    ifステートメントを使用すると、ステートメントが$trueの場合だけでなく、$falseの場合もアクションを指定できます。 ここで、elseステートメントが役に立ちます。

    else

    elseステートメントは、常にifステートメントの最後の部分です。

    この例では、$pathをチェックして、ファイルであることを確認します。 ファイルが見つかったら、それを移動します。 そうでなければ、警告を書きます。, このタイプの分岐ロジックは非常に一般的です。

    ネストされたif

    ifおよびelseステートメントはスクリプトブロックを取るので、別のifステートメントを含むPowerShellコマンドを内部に置くことができます。 これにより、はるかに複雑なロジックを利用できます。

    この例では、最初に幸せなパスをテストしてから、それに対してアクションを実行します。 それが失敗した場合、私たちは別のチェックを行い、ユーザーにより詳細な情報を提供します。

    elseif

    単一の条件付きチェックに限定されるものではありません。, ifおよびelseステートメントをelseifステートメントを使用してネストするのではなく、elseifステートメントをチェーンすることができます。

    実行は上から下に行われます。 トップifステートメントが最初に評価されます。 その場合$false、次に移動しますelseifまたはelseリスト内。 その最後のelseは、他のどれもが$trueを返さない場合に実行するデフォルトアクションです。,

    switch

    この時点で、switchステートメントに言及する必要があります。 これは、値との複数の比較を行うための代替構文を提供します。 switchを使用すると、式を指定し、その結果はいくつかの異なる値で比較されます。 これらの値のいずれかが一致する場合、一致するコードブロックは実行されません。 この例を見てみましょう:

    $itemType = 'Role'switch ( $itemType ){ 'Component' { 'is a component' } 'Role' { 'is a role' } 'Location' { 'is a location' }}

    一致することができる三つの可能な値があります$itemType。 この場合、Roleと一致します。, 簡単な例を使用して、switch演算子に触れることができました。 私はもっと話します別の記事でswitch文について知りたかったことすべてについて。

    パイプライン

    パイプラインはPowerShellのユニークで重要な機能です。 変数に割り当てられていない値は、パイプラインに配置されます。 ifは、必ずしも明白ではない方法でパイプラインを活用する方法を提供します。,

    $discount = if ( $age -ge 55 ){ Get-SeniorDiscount}elseif ( $age -le 13 ){ Get-ChildDiscount}else{ 0.00}

    各スクリプトブロックは、結果をコマンドまたは値をパイプラインに配置します。 次に、ifステートメントの結果を$discount変数に割り当てます。 この例では、これらの値を$discount各scriptblock変数に直接割り当てるのと同じように簡単に割り当てることができます。 これをifステートメントで頻繁に使用するとは言えませんが、最近これを使用した例があります。,

    Array inline

    私はいくつかのコマンドlineargumentsで実行可能ファイルを起動するInvoke-SnowSqlという関数を持っています。 ここで私は引数の配列を構築するその関数からのクリップです。

    $Debugおよび$Path変数は、エンドユーザーによって提供される関数上のパラメーターです。私は配列の初期化内でそれらをインラインで評価します。 もし$Debugが真であれば、それらの値は正しい場所の$snowSqlParamに落ちます。 同じことが、$Path変数にも当てはまります。,

    複雑な操作を簡素化

    チェックするには比較が多すぎる状況に遭遇し、Ifステートメントが画面の右側からスクロール

    それらは読みにくい場合もあり、それは間違いをするためにより傾向がある作る。 それについてwecanいくつかのことがあります。

    行継続

    PowerShellには、コマンドを次の行にラップできる演算子がいくつかあります。, Logicaloperators-andおよび-or式を複数の行に分割する場合に使用するのに適した演算子です。

    まだ多くのことが起こっていますが、それぞれのピースを独自のラインに配置することは大きな違いになります。私は一般的に、二つ以上の比較を取得するとき、またはロジックのいずれかを右にスクロールしなければならない場合にこれを使用します。

    事前計算結果

    その文をif文から取り出し、結果のみをチェックできます。

    これはちょうど前の例よりもはるかにきれいに感じています。, あなたはまた、あなたが本当にチェックしていることを説明するavariable nameを使用する機会を与えられます。 これは、不要なコメントを保存する自己文書化コードの例でもあります。

    複数のifステートメント

    これを複数のステートメントに分割して一度にチェックすることができます。 この場合、結果を結合するためにaflagまたは追跡変数を使用します。

    私はフラグロジックを正しく動作させるためにロジックを反転する必要がありました。 各評価は個別のifステートメントです。, これの利点は、あなたがデバッグしているとき、あなたはロジックが何をしているかを正確に理解できることです。 私は同時にはるかに優れた冗長さを追加することができました。

    明らかな欠点は、書くべきコードがはるかに多いということです。 コードは見るのがより複雑ですそれはロジックの単一行を取り、それを25行以上に爆発させるように。

    関数を使用して

    そのすべての検証ロジックを関数に移動することもできます。 かに清掃の手順はこちらを見aglance.,

    if ( Test-SecureDriveConfiguration -ADUser $user ){ # do something}

    検証を行うための関数を作成する必要がありますが、このコードは作業がはるかに簡単になります。 このコードをテストしやすくします。 テストでは、Test-ADDriveConfiguration呼び出しをモックすることができます。 それが返すもの$trueそしてそれが返すもの$false。 他の機能をテストするのは、それほど小さいので簡単です。

    その関数の本体は、まだ私たちが始めたワンライナーまたは私たちが最後のセクションで使用した爆発したロジックである可能性があります。, これは両方のシナリオでうまく機能し、後でその実装を簡単に変更できます。

    エラー処理

    ifステートメントの重要な使用方法は、intoerrorsを実行する前にエラー条件をチェックすることです。 良い例は、フォルダを作成する前にフォルダが既に存在するかどうかを確認することです。

    if ( -not (Test-Path -Path $folder) ){ New-Item -Type Directory -Path $folder}

    私はあなたが例外が起こることを期待するならば、それは本当に例外ではないと言いたいと思います。 だからcheckyour値とあなたができるあなたの条件を検証します。,

    実際の例外処理についてもう少し詳しく説明したい場合は、例外について知りたいことがある記事があります。

    例外処理について知りたいことがあります。

    最後の言葉

    ifステートメントはそのような単純なステートメントですが、PowerShellの基本的な部分です。 あなたが書くほとんどすべてのスクリプトでこれを複数回使用して自分自身をwillfind。 あなたが以前よりも良い理解を持っていることを願っています。

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です