Windows PowerShell: 空白文字を入れてください

あちこちにある空白文字を含め、書式設定を適切に行うと、Windows PowerShell のコマンドが、とても理解しやすくなります。

Don Jones

次の関数を見て、この関数の機能を解読してみてください。これは実際に動作する本物の "高度な関数" です。皆さんにやってみてもらいたいことは、この関数を実行しないで、その目的を解読することです。

function Get-PCInfo { [CmdletBinding()] param( [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelineByPropertyName=$True)][string[]]$computername ) PROCESS { Write-Verbose "Beginning PROCESS block" foreach ($computer in $computername) { Write-Verbose "Connecting to $computer" try {$continue = $true $cs = Get-WmiObject -EV mybad -EA Stop -Class Win32_computersystem -ComputerName $computer } catch {$continue = $false $computer | Out-File -FilePath oops.txt -append Write-Verbose "$computer failed" $mybad | ForEach-Object { Write-Verbose $_ } }if ($continue) { $proc = Get-WmiObject win32_processor -ComputerName $computer | select -first 1 $obj = new-object -TypeNamePSObject $obj | add-member NotePropertyComputerName $computer $obj | add-member NotePropertyProcArchitecture $proc.addresswidth $obj | add-member NoteProperty Domain $cs.domain $obj | add-memberNotePropertyPCModel $cs.model $obj.psobject.typenames.insert(0,'MyPCInfo') write-output $obj }}}}

この関数の目的を特定するのは難しいと思います。と言うのも、この関数では、インターネットで公開されている多くのスクリプトやサンプルに見られるありふれた間違いを犯しているからです。皆さんのローカル フォルダーにも、同じような関数があるかもしれません。問題は、この関数で、空白文字を使用していないことです。それでは、次の修正した例を見てみてください。

function Get-PCInfo { [CmdletBinding()] param( [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)] [string[]]$computername ) PROCESS { Write-Verbose "Beginning PROCESS block" foreach ($computer in $computername) { Write-Verbose "Connecting to $computer" try { $continue = $true $cs = Get-WmiObject -EV mybad -EA Stop ` -Class Win32_computersystem ` -ComputerName $computer } catch { $continue = $false $computer | Out-File -FilePath oops.txt -append Write-Verbose "$computer failed" $mybad | ForEach-Object { Write-Verbose $_ } } if ($continue) { $proc = Get-WmiObject win32_processor ` -ComputerName $computer | select -first 1 $obj = new-object -TypeNamePSObject $obj | add-member NotePropertyComputerName $computer $obj | add-member NotePropertyProcArchitecture $proc.addresswidth $obj | add-member NoteProperty Domain $cs.domain $obj | add-memberNotePropertyPCModel $cs.model $obj.psobject.typenames.insert(0,'MyPCInfo') write-output $obj } } } }

かなり読みやすくなったのではないかと思います。{ } 構造内のコマンドにはインデントが設定され、長いコマンドは、適宜折り返されており、とても読みやすくなりました。

適切に書式設定されていると、スクリプトがデバッグしやすくなります。インデントが設定されていない状態で、不適切な位置にある中かっこや不足している中かっこを探してみてください。状況がわからなくなる可能性が高いと思います。問題は、多くの人が、このような書式設定を行う方法を知らないことです。では、早速、その問題を解決しましょう。

インデント

Windows PowerShell 2.0 のインストーラーに同梱されて無償で利用できる Windows PowerShell ISE も含め、多くのスクリプト エディターでは Tab キーでインデントを設定できます。タブ文字の代わりに 4 ~ 5 個の空白文字を挿入される方もいますが、それでもかまいません。多くのスクリプト エディターでは、コマンドのブロックを選択した状態で Tab キーを押すと、ブロック全体にインデントが設定され、Shift + Tab キーを押すと、インデントが解除されます。

簡単な操作で、コードの見た目をきれいにできるので便利です。また、多くのエディターでは、インデントが維持されるため、あるコード行の入力が完了して、Enter キーを押すと、カーソルは、次の行の同じ位置に移動します。

改行

特に Windows PowerShell スクリプトでは、改行はインデントほどわかりやすいものではありません。改行を追加する目的は、やむを得ない場合を除き、コード行の折り返しを避けることです。Windows PowerShell では、コード行が継続することをシェルに伝える次のような文字の後に改行を挿入できます。

  • コンマ
  • セミコロン
  • パイプ文字

これを理解するには、修正した例を見てください。

Windows PowerShell のエスケープ文字であるアクサン クラーブ文字 (`) を使用することもできます。アクサン クラーブ文字の直後に改行を追加すると、改行文字を "エスケープ" できます。このようにすると、Windows PowerShell では、後続の行を現在の行と同じ論理行として処理します。つまり、アクサン クラーブ文字は、一種の行継続文字になります。ただし、個人的には、この文字は好きではありません。と言うのも、この文字は画面上でも印刷しても見づらく、モニターの常時点灯のドットや印刷した紙面上のインク汚れと混同するおそれがあるからです。

また使い方を誤る可能性が高いという問題もあります。直後にスペースやタブ文字など判別しづらい空白文字があると、アクサン クラーブ文字は行継続文字として機能しません。また、改行を "エスケープ" しません。改善したコードでは、参考情報として、アクサン クラーブ文字を使用しましたが、アクサン クラーブ文字以外に使用できるものがある場合、この文字は使用しなくてかまいません。

一貫性

一貫性は重要です。たとえば、私は、次のような構造を使用しています。

if ($continue) { # some code goes here }

ですが、次のような構造を好んで使用する方もいるでしょう。

if ($continue) { # some code goes here }

どちらの形式を使用してもかまいませんが、どちらかお好きな形式で統一してください。これは、コードの一貫性を保って読みやすくするためです。

書式設定のための見直しを

これまでに実行してきた読みづらい古いスクリプトを探し出し、少し時間を取って、書式設定を行ってみてください。これは、半年後に、スクリプトの処理内容を解読する自分以外の人に対するとても親切な行為になります。また、半年後に自分で関数の処理を解読しなければならなくなることも十分にあり得ます。

Don Jones

Don Jones は、Microsoft MVP の受賞者で、『Learn Windows PowerShell in a Month of Lunches』(Manning Publications Co.、2010 年) の著者でもあります。この書籍は、管理者が Windows PowerShell を効率的に使用できるようにすることを目的としています。また、一般ユーザーを対象にオンサイトの Windows PowerShell トレーニングも開催しています。Don に対するお問い合わせについては、彼の Web サイト (ConcentratedTech.com、英語) を参照してください。

関連コンテンツ