PowerShell でコマンドを複数行に分割する方法

読みやすいコードは、その機能の目的をユーザーに非常に簡単に伝えます。変数名やメソッド名は、コードの可読性のために適切な命名規則を持つべきです。
コードの可読性に寄与する他の属性は、一貫したインデントとフォーマットスタイルです。Windows PowerShell のマルチラインコマンドは、長いコマンドラインを複数のステートメントに分割するのに役立ちます。
Windows PowerShell では、バックティック文字を使用して、長いコマンドや単一行のコマンドをマルチラインステートメントに簡単に分割できます。
バックティック文字は、一種のエスケープ文字として使用されます。これは改行文字をエスケープし、行の継続をもたらします。
この記事では、長いコマンドを複数行に分割するための Windows PowerShell のマルチラインコマンドの重要性について説明します。
Windows PowerShell マルチラインコマンド
長いコマンドを複数行に分割するには、バックティック文字を使用してそれを複数行に分けます。
例えば、ローカルコンピュータの空きディスクスペース情報を取得したいとします。残念ながら、この特定の情報を取得するためのスクリプトは、長大なコマンドであるため、読みづらく管理が難しいです。
サンプルコード:
Get-WmiObject -Class win32_logicaldisk | Format-Table DeviceId, MediaType, @{n = "Size"; e = { [math]::Round($_.Size / 1GB, 2) } }, @{n = "FreeSpace"; e = { [math]::Round($_.FreeSpace / 1GB, 2) } }
この記事では構文が分割されているように見えるかもしれませんが、コマンドラインインターフェイスにコピーすると、上記の例は非常に長い 1 行スクリプトです。
私たちは、与えられたコマンドでの行の継続のために、Windows PowerShell のバックティック文字を使用して簡単に長いコマンドを複数行に分割できます。
サンプルコード:
Get-WmiObject -Class win32_logicaldisk `
| Format-Table DeviceId, `MediaType, @{n = "Size"; e = { [Math]::Round($_.Size / 1GB, 2) } }, `
@{n = "FreeSpace"; e = { [Math]::Round($_.FreeSpace / 1GB, 2) } }
私たちのコードでは、可読性を向上させるために、長いコマンドを複数行に分割するために PowerShell でバックティックを行継続文字として利用しています。Get-WmiObject -Class win32_logicaldisk
から始め、これによりシステム上の論理ディスクについての情報を取得します。
この行の終わりのバックティックは、コマンドが次の行に続くことを示します。その後、出力を Format-Table
にパイプ(|
)し、出力をテーブルとしてフォーマットします。
ここでは、特に DeviceId
と MediaType
を表示することを選択しています。Size
と FreeSpace
のプロパティについては、計算フィールド(@{n = "Name"; e = { Expression }}
構文で示される)を使用します。
これらの計算フィールド内でも、再びバックティックを使用して行を続けます。式は、[Math]::Round($*.Size / 1GB, 2)
と [Math]::Round($*.FreeSpace / 1GB, 2)
を使用して、サイズと空きスペースをバイトからギガバイトに変換し、小数点以下 2 桁に丸めます。
バックティックでこの複雑なコマンドを分解することにより、スクリプトをより管理しやすくし、その意図を明確にし、メンテナンスと可読性を助けます。
出力:
Windows PowerShell におけるマルチラインコマンドを使用すると、コード構造は簡単に読みやすく、維持しやすくなります。しかし、バックティック文字は通常、読みづらくバグを招くため、推奨されていません。
したがって、長いコードラインを分割するための代替手段があります。
特定の演算子を使用して長いコードラインを分割する
PowerShell は、行の継続に関して直感的です。特定の演算子や構文構造は、本質的にコマンドが複数行にまたがることをインタープリタに示します。
これは、可読性がメンテナンスの容易さや理解のしやすさに大きく影響する複雑なスクリプトで特に役立ちます。
パイプライン(|
)を使用して長いコードラインを分割する
通常、コマンドがその時点で文法的に完了できない場合、行は自動的に継続されます。
1つの例は、新しいパイプライン要素(|
)を開始することです。パイプラインは問題なく動作します。なぜなら、パイプライン演算子の後に、コマンドが完了することができず、別のパイプライン要素が欠けているためです。
したがって、私たちのインタープリタは、次のコマンドラインで次のパイプライン要素を探します。
サンプルコード:
Get-Process |
Where-Object { $_.ProcessName -like "powershell" } |
Select-Object Id, ProcessName, CPU
私たちのスクリプトでは、Get-Process
から始めて、現在実行中のすべてのプロセスを取得します。Get-Process
の出力は、その後 Where-Object
にパイプされ、powershell
を名前に含むプロセスをフィルタリングします。
これは、プロセス名に一致させるためにスクリプトブロック {}
内で -like
演算子を使用することによって達成されます。
これに続いて、フィルタリングされた結果を Select-Object
にパイプします。ここでは、フィルタリングされたプロセスの Id
、ProcessName
、CPU
使用量のみを保持することを指定します。
パイプラインを使用することで、コマンドを管理可能な部分に効果的に分解し、それぞれを別の行に配置しました。これにより、スクリプトはより読みやすくなり、デバッグや将来の修正も簡単になります。
出力:
カンマ(,
)を使用して長いコードラインを分割する
カンマ(,
)も、パイプライン演算子のような文脈で機能します。
命令やスクリプトブロック内の特定の文脈では、カンマ演算子も行の継続信号として機能します。これは、コマンドをフォーマットしたり、項目のリストを渡したりする際に特に便利です。
サンプルコード:
Get-EventLog -LogName Application -Newest 5 |
Format-Table TimeGenerated,
EntryType,
Source,
@{n = 'Message'; e = { $_.Message.Split("`n")[0] } }
私たちのスクリプトでは、Get-EventLog
を使用してアプリケーションログから最新の 5 エントリを取得します。この出力は、フォーマットのために Format-Table
にパイプされます。
次に、カンマメソッドを使用して、テーブルに表示したいプロパティをリストします:TimeGenerated
、EntryType
、Source
、および Message
のカスタム式。Message
のカスタム式は計算プロパティ(@{n='Message'; e= { $_.Message.Split("n")[0] } }
)を使用して、メッセージの最初の行のみを表示し、可読性を向上させます。
カンマを使用してこのコマンドを複数行に分割することにより、特に複数のプロパティや複雑な式に対処する際に、スクリプトがより読みやすくなりました。
出力:
波かっこ({}
)を使用して長いコードラインを分割する
また、スクリプトブロックを定義する際の波かっこ({}
)は、行の継続を直接許可します。これは、ループ、条件文、または cmdlet にコマンドブロックを渡す際に欠かせません。
サンプルコード:
$processes = Get-Process
$filteredProcesses = $processes | Where-Object {
$_.WorkingSet -gt 100MB
} | ForEach-Object {
$_.ProcessName
}
$filteredProcesses
私たちはまず、Get-Process
コマンドレットを使用してすべてのプロセスのリストを取得します。その後、パイプラインがこれらのプロセスを Where-Object
に渡し、スクリプトブロックが 100MB
を超えるワーキングセットを持つプロセスをフィルタリングします。
生き残ったプロセスは、ForEach-Object
の別のスクリプトブロックに渡され、プロセスの名前を抽出して出力します。スクリプトブロックのために波かっこを使用することで、パイプラインを通じてデータの流れが明確で簡潔になり、機能的なものになります。
出力:
結論
この記事を通じて、PowerShell スクリプトの可読性を向上させるためのさまざまな方法を探求しました。可読性は、Windows PowerShell においてスクリプトの理解とメンテナンスの容易さにおいて重要です。この環境では、スクリプトが長大かつ複雑になることがよくあります。
まず、マルチラインコマンドのためにバックティック文字を使用する一般的な慣行について議論しましたが、効果的である一方で、その微妙な性質のために時には可読性の問題や潜在的なバグを引き起こす可能性があります。
しかし、PowerShell は長いコードラインを分割するためのより直感的な方法を提供しており、それについて掘り下げました。パイプライン(|
)、カンマ(,
)、波かっこ({}
)などの特定の演算子を使用することで、スクリプトの書き方におけるより可読で維持しやすいアプローチを提供します。
これらの方法は、コードの視覚的構造を改善するだけでなく、論理的な流れも向上させ、スクリプトのデバッグや修正を容易にします。
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn