Articles

switch文について知りたかったすべて

  • 03/01/2021
  • 読むのに12分
    • s
    • ccc
    • c

  • cccccccccccccccccccccccli>

  • x

他の多くの言語と同様に、powershellにはyourscripts内の実行フローを制御するためのコマンドがあります。 これらの文の1つはswitch文であり、PowerShellでは、他の言語では見られない機能を提供します。 今日は、PowerShellswitchの操作について詳しく説明します。

この記事の元のバージョンは@KevinMarquetteによって書かれたブログに登場しました。 ThePowerShellチームは、このコンテンツを私たちと共有してくれたKevinに感謝します。 彼のブログをチェックしてくださいatPowerShellExplained.com最初に学習する文の1つは、if文です。

if文

最初に学習する文の1つは、if$trueの場合、スクリプトブロックを実行できます。

if ( Test-Path $Path ){ Remove-Item $Path}

elseifelseswitchです。

Switch文

switch文を使用すると、変数と可能な値のリストを提供することができます。 値が変数を変更した場合は、そのscriptblockが実行されます。この例では、$day$resultに割り当てられます。 この例では変数の割り当てのみを行っていますが、これらのスクリプトブロックでPowershellを実行することができます。

変数に代入する

最後の例を別の方法で書くことができます。PowerShellパイプラインに値を配置し、それを$resultifforeachステートメントでも同じことができます。

Default

defaultUnknownを返します。最後の例では数字と一致していましたが、文字列と一致させることもできます。

Strings

最後の例では数字と一致していましたが、文字列私はラップしないことにしましたComponentRoleLocationswitchはそれらを文字列として扱います。PowerShellのクールな機能の1つswitchswitch配列、それはそのコレクション内の各要素を処理します。あなたの配列内の項目を繰り返している場合、それらは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になります。通常、ここではbreakcontinueforeachcontinueswitchを終了します。 最後の例を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 }}

入力ファイルの行にはErrorWarningの両方の単語が含まれている可能性があるため、最初のものだけを実行

Break

abreakcontinuebreakcontinueErrorbreakErrorWarningErrorWarningの両方が含まれている可能性がありますが、toprocessは1つだけです。 これは、continueステートメントが私たちのためにやっていることです。P>

ブレークラベル

switchbreak/continueforeachbreak/continueラベルをサポートしています。私は個人的にブレークラベルの使用が好きではありませんが、あなたが前にそれらを見たことがない場合、彼らはreconfusingので、私はそれらを指摘したかった 複数のswitchforeachステートメントがネストされている場合は、最も内側の項目以上から抜け出すことができます。 Labelonにswitchbreakのターゲットになることができます。PowerShell5.0は列挙型を提供し、それらをスイッチで使用できます。すべてを厳密に型指定された列挙型として保持したい場合は、それらを括弧で囲むことができます。スイッチが値::Locationasaリテラル文字列を扱わないように、ここでは括弧が必要です。

ScriptBlock

必要に応じて、scriptblockを使用して一致の評価を実行できます。これは複雑さを増し、あなたのswitchifelseifステートメントを使用する方が良いでしょう。 私はすでに場所に大きなスイッチを持っていたし、私は同じ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でやったものです。 hashtableswitchステートメントが頻繁に対処している一般的なパターンへの別のアプローチです。p>ルックアップとしてswitchhashtableを使用することがよくあります。PowerShell5.0ではEnum

$day = 3enum DayOfTheWeek { Sunday Monday Tuesday Wednesday Thursday Friday Saturday}$day
Wednesday

この問題を解決するためのさまざまな方法を一日中見て行くことができます。 私はちょうどあなたがオプションを持っていたことを知っていることを確認したかった。switch文は表面的には単純ですが、ほとんどの人が気づいていないいくつかの高度な機能を提供しています。

Final words

switch文は表面的には単純ですが、ほと これらの機能を一緒にひもでつなぐことは、これを強力な機能にします。 私はあなたが前に実現していなかった何かを学んだことを願っています。

コメントを残す

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