switch文について知りたかったすべて
- 03/01/2021
- 読むのに12分
-
- s
- ccc
c
- x
cccccccccccccccccccccccli>
他の多くの言語と同様に、powershellにはyourscripts内の実行フローを制御するためのコマンドがあります。 これらの文の1つはswitch文であり、PowerShellでは、他の言語では見られない機能を提供します。 今日は、PowerShellswitch
の操作について詳しく説明します。
注
この記事の元のバージョンは@KevinMarquetteによって書かれたブログに登場しました。 ThePowerShellチームは、このコンテンツを私たちと共有してくれたKevinに感謝します。 彼のブログをチェックしてくださいatPowerShellExplained.com最初に学習する文の1つは、if
文です。
if文
最初に学習する文の1つは、if
$true
の場合、スクリプトブロックを実行できます。
if ( Test-Path $Path ){ Remove-Item $Path}
elseif
else
switch
です。
Switch文
switch
文を使用すると、変数と可能な値のリストを提供することができます。 値が変数を変更した場合は、そのscriptblockが実行されます。この例では、$day
$result
に割り当てられます。 この例では変数の割り当てのみを行っていますが、これらのスクリプトブロックでPowershellを実行することができます。
変数に代入する
最後の例を別の方法で書くことができます。PowerShellパイプラインに値を配置し、それを$result
if
foreach
ステートメントでも同じことができます。
Default
default
Unknown
を返します。最後の例では数字と一致していましたが、文字列と一致させることもできます。
Strings
最後の例では数字と一致していましたが、文字列私はラップしないことにしましたComponent
Role
Location
switch
はそれらを文字列として扱います。PowerShellのクールな機能の1つswitch
switch
配列、それはそのコレクション内の各要素を処理します。あなたの配列内の項目を繰り返している場合、それらはappropriatesectionによって複数回一致しています。処理された現在のアイテムを参照するには、$PSItem
$_
を使用できます。 Asimple matchを実行すると、$PSItem
が一致する値になります。 この変数が使用されている次のセクションで、いくつかの高度な一致を実行します。
パラメータ
PowerShellのユニークな機能switch
それはそれがどのように実行するかを変更するスイッチパラメータの数を持っているとい
-CaseSensitive
デフォルトでは、一致は大文字と小文字を区別しません。 大文字と小文字を区別する必要がある場合は、-CaseSensitive
を使用できます。 これは、他のスイッチパラメータと組み合わせて使用することができます。
-Wildcard
-wildcard
-like
演算子と同じワイルドカードロジックを使用して各一致を行います。p>
$Message = 'Warning, out of disk space'switch -Wildcard ( $message ){ 'Error*' { Write-Error -Message $Message } 'Warning*' { Write-Warning -Message $Message } default { Write-Information $message }}
WARNING: Warning, out of disk space
ここでは、メッセージを処理し、内容に基づいて異なるストリームに出力しています。
-Regex
switch文は、ワイルドカードと同じように正規表現の一致をサポートします。私が書いた別の記事で正規表現を使用する例がもっとあります:正規表現を使用する多くの方法。switch文のあまり知られていない機能は、-File
-file
$PSItem
を使用します。 これにより、ログファイルが処理され、正規表現の一致に応じて警告とerrormessagesに変換されます。
詳細な詳細
これらすべての文書化された機能を認識したので、より高度な処理のコンテキストでそれらを使用できます。
式
switch
は、変数の代わりに式にすることができます。p>
switch ( ( Get-Service | Where status -eq 'running' ).name ) {...}
式が評価されるものは何でも、一致に使用される値です。あなたはすでにこれを拾っているかもしれませんが、switch
-wildcard
-regex
一致を使用する場合に特に当てはまります。 同じ条件を複数回追加することができ、それらのすべてがトリガーされます。
switch ( 'Word' ){ 'word' { 'lower case word match' } 'Word' { 'mixed case word match' } 'WORD' { 'upper case word match' }}
lower case word matchmixed case word matchupper case word match
これらのステートメントはすべて発射されます。 これは、すべての条件が(順番に)チェックされていることを示しています。 これは、各項目が各条件をチェックする配列を処理する場合にtrueになります。通常、ここではbreak
continue
foreach
continue
switch
を終了します。 最後の例をcontinue文で書き直して、1つの文だけが実行されるようにすることができます。
switch ( 'Word' ){ 'word' { 'lower case word match' continue } 'Word' { 'mixed case word match' continue } 'WORD' { 'upper case word match' continue }}
lower case word match
三つの項目すべてを一致させる代わりに、最初の項目が一致し、スイッチはnextvalueに続きます。 処理する値が残っていないため、スイッチは終了します。 次の例は、ワイルドカードが複数の項目に一致する方法を示しています。
switch -Wildcard -File $path{ '*Error*' { Write-Error -Message $PSItem continue } '*Warning*' { Write-Warning -Message $PSItem continue } default { Write-Output $PSItem }}
入力ファイルの行にはError
Warning
の両方の単語が含まれている可能性があるため、最初のものだけを実行
Break
abreak
continue
break
continue
Error
break
Error
Warning
Error
Warning
の両方が含まれている可能性がありますが、toprocessは1つだけです。 これは、continue
ステートメントが私たちのためにやっていることです。P>
ブレークラベル
switch
break/continue
foreach
break/continue
ラベルをサポートしています。私は個人的にブレークラベルの使用が好きではありませんが、あなたが前にそれらを見たことがない場合、彼らはreconfusingので、私はそれらを指摘したかった 複数のswitch
foreach
ステートメントがネストされている場合は、最も内側の項目以上から抜け出すことができます。 Labelonにswitch
break
のターゲットになることができます。PowerShell5.0は列挙型を提供し、それらをスイッチで使用できます。すべてを厳密に型指定された列挙型として保持したい場合は、それらを括弧で囲むことができます。スイッチが値::Location
asaリテラル文字列を扱わないように、ここでは括弧が必要です。
ScriptBlock
必要に応じて、scriptblockを使用して一致の評価を実行できます。これは複雑さを増し、あなたのswitch
if
elseif
ステートメントを使用する方が良いでしょう。 私はすでに場所に大きなスイッチを持っていたし、私は同じevaluationblockをヒットするために二つの項目が必要な場合、私はthisを使用することを検討します。読みやすさに役立つと思うことの1つは、scriptblockを括弧内に配置することです。p>
switch ( $age ){ ({$PSItem -le 18}) { 'child' } ({$PSItem -gt 18}) { 'adult' }}
それはまだ同じ方法で実行され、すぐにそれを見たときに、より良い視覚的な休憩を与えます。
Regex$matches
すぐには明らかではない何かに触れるためにregexを再訪する必要があります。 Regexpopulatesを使用すると、$matches
$matches
の使用に入ります。 ここでは、名前付きの一致で動作するようにそれを示すための簡単なサンプルです。
$message = 'my ssn is 123-23-3456 and credit card: 1234-5678-1234-5678'switch -regex ($message){ '(?<SSN>\d\d\d-\d\d-\d\d\d\d)' { Write-Warning "message contains a SSN: $($matches.SSN)" } '(?<CC>\d\d\d\d-\d\d\d\d-\d\d\d\d-\d\d\d\d)' { Write-Warning "message contains a credit card number: $($matches.CC)" } '(?<Phone>\d\d\d-\d\d\d-\d\d\d\d)' { Write-Warning "message contains a phone number: $($matches.Phone)" }}
WARNING: message may contain a SSN: 123-23-3456WARNING: message may contain a credit card number: 1234-5678-1234-5678
null null
デフォルトである必要はありません$null
値を一致させるこ
$value = $nullswitch ( $value ){ $null { 'Value is null' } default { 'value is not null' }}```OutputValue is null
空の文字列についても同じことが言えます。
switch ( '' ){ '' { 'Value is empty' } default { 'value is a empty string' }}```OutputValue is empty
定数式
Lee Daileyは、定数$true
項目を評価できることを指摘しました。発生する必要があるブール値のチェックがいくつかあるとします。
$isVisible = $false$isEnabled = $true$isSecure = $trueswitch ( $true ){ $isEnabled { 'Do-Action' } $isVisible { 'Show-Animation' } $isSecure { 'Enable-AdminMenu' }}
Do-ActionEnabled-AdminMenu
これは、いくつかのブール型フィールドのステータスを評価し、アクションを実行するためのクリーンな方法です。 これについてのクールなことは、まだ評価されていない値のステータスを1つの一致で反転させることができるということです。この例では、$isVisible
Do-ActionShow-Animation
$isEnabled
$true
$isVisible
Do-ActionShow-Animation
に設定されます$true
。 次に、$isVisible
が評価されると、そのscriptblockが呼び出されます。 これはbitcounter-直感的ですが、力学の巧妙な使用です。p>
automatic switch自動変数
switch
$switch
。 これはPowerShellによって作成された自動変数であり、直接操作できます。
$a = 1, 2, 3, 4switch($a) { 1 { $switch.MoveNext(); $switch.Current } 3 { $switch.MoveNext(); $switch.Current }}
これはあなたの結果を与えます:
24
列挙子を前方に移動すると、次の項目はswitch
で処理されませんが、その値に直接アクセスできます。 私はそれを狂気と呼ぶでしょう。
他のパターン
Hashtables
私の最も人気のある投稿の一つは、私がhashtablesでやったものです。 hashtable
switch
ステートメントが頻繁に対処している一般的なパターンへの別のアプローチです。p>ルックアップとしてswitch
hashtable
を使用することがよくあります。PowerShell5.0ではEnum
$day = 3enum DayOfTheWeek { Sunday Monday Tuesday Wednesday Thursday Friday Saturday}$day
Wednesday
この問題を解決するためのさまざまな方法を一日中見て行くことができます。 私はちょうどあなたがオプションを持っていたことを知っていることを確認したかった。switch文は表面的には単純ですが、ほとんどの人が気づいていないいくつかの高度な機能を提供しています。
Final words
switch文は表面的には単純ですが、ほと これらの機能を一緒にひもでつなぐことは、これを強力な機能にします。 私はあなたが前に実現していなかった何かを学んだことを願っています。