- 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
値は$false
if
ステートメントで評価されます。, 特に$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。 あなたが以前よりも良い理解を持っていることを願っています。