Windows PowerShell

Microsoftの製品には、どれひとつとして「センスある!」と思ったことがなかったが、この Microsoft Windows PowerShell は初めてそう思わされた。

PowerShellとは、Linuxのbashなどに比べて圧倒的に弱かったWindowsの コマンド プロンプト を置き換える次世代のWindows用シェルだ。当初はVistaに同梱される予定だったが、XP / Vista / 2003 Server 向けのものがOSとは別にダウンロード配布されている。shなどの古典的なシェルとPowerShellが大きく違うところは、shなどがテキスト指向なのに対してPowerShellはオブジェクト指向なところである。また、オブジェクトは .NET Framework で定義されているものを使用しているため、C#や VisutalBasic .NET などとも親和性が高い。具体的に見てみよう。現在実行されているプロセス数を数える場合、Linuxのshだと以下のようにするだろう。

$ expr `ps aux | wc -l` – 1
122

expr- 1 しているのは、psの出力結果に列ラベルがついているからだ。列ラベルを非表示にするパラメーターがあるのかも知れないが、そのパラメーターは IBM AIX のpsにもあるのかどうかなど、いずれにしろ出力フォーマットを強く意識しないと使用できない。一方、PowerShellではどうだろう。

PS> (ps).length
96

Cygwinなしでpsが使えること自体にも驚きだが、psではProcessクラスのオブジェクトの配列が戻され、それをカッコで無名配列とし、無名配列のlengthプロパティを表示している。

続いて、foo_から始まらないメモリー使用率の高いプロセス上位5個を表示してみよう。Linuxのshでは以下のような感じだろう。

$ ps aux | grep -v ‘USER *PID’ |
> awk ‘{print $4, $11}’ | grep -v ‘[ /]foo_’ |
> sort -rn | head -5
4.8 spamd
4.5 /usr/lib/AntiVir/antivir
4.4 spamd
4.1 /usr/bin/spamd
3.1 amavisd

かなり出力フォーマットに依存した方法であり、psのパラメーターを-efにしただけで正しく動かないだろう。一方、PowerShellだと以下のように行う。

PS> ps | where {$_.ProcessName -notlike ‘foo_*’} |
>> sort PM -desc | select PM, ProcessName -first 5

PM ProcessName
— ———–
39157760 powershell
37371904 Rtvscan
36753408 firefox
29794304 thunderbird
26140672 Skype

psProcessクラスのオブジェクトの配列を戻し、それ(パイプで渡されたオブジェクトは$に入る)のProcessNameプロパティがfoo*でないものに限る。そして、そのProcessクラスのPMプロパティで降順ソートして最初の5つのオブジェクトのPMプロパティとProcessNameプロパティを表示する。かなり読みやすし、SQLに慣れた身にはselectwhereというコマンドにはしびれるものがあるだろう。

文字列演算子-replaceでは「姓名の入れ替え」などができなかったり、バージョン1.0ということで足りない部分も見受けられるが、コンセプトとしてはかなり面白いと思う。また、CygwinではWindowsのシステム部分を触れないが、PowerShellはWindowsネイティブなだけあってレジストリだって変更できる。

PS> cd HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds
PS> Set-ItemProperty Microsoft.PowerShell `
>> -Name ExecutionPolicy RemoteSigned

そんなわけで、「テンポラリ・フォルダーの中で一週間アクセスのないファイルまたは空っぽのフォルダーを削除するスクリプト」を作成してみた。Linuxで言うところのtmpwatchで、これを定期的に実行すればテンポラリ・フォルダーがあふれることがなくなる。

スクリプトを実行するには呼び出し演算子(&)を使う。ただし、デフォルトでは署名なしのスクリプトはリモート / ローカルともに実行できないので、ローカルのPS1ファイルは署名なしで実行できるようするため、最初の一度だけSet-ExecutionPolicyを実行しよう。(もちろんこのPS1ファイルは自己責任で動作させること)

PS> Set-ExecutionPolicy RemoteSigned
PS> & ‘D:\purgetemp.ps1’

エクスプローラからダブル・クリックで実行できるようにするには、右クリック「新規作成 > ショートカット」で以下のようなショートカットを作成する。

ショートカットの作成

<

p>PowerShellは非常に便利そうだが情報はまだまだ少ない。ブルース・ペイエット『Windows PowerShell イン アクション』(SOFTBANK)でも買って本腰を入れて勉強したいと思う。

コメントを残す