PowerShell Memo

このサイトはPowerShell(MSH/Monad)奮闘記です

管理人「newpops吉岡洋」が
「PowerShell(旧名:MSH/Monad)」の研究結果を日々綴っていきます。

【お知らせ】
この日記からPowerShellのTipsを抽出し「PowerShell FAQ」として整理しました。


2006-05-31

[]Windows Presentation Foundation

Windows Presentation Foundation

今、興味を強く惹かれているのが、「Windows Presentation Foundation」です。

Windows Presentation Foundation(WPF)はWinFXで導入される、

Windowsプレゼンテーション層を担うフレームワークです。

#以前、「Avalon」というコード名で呼ばれていたものです。


今後、このブログでWPFの話題も扱っていく予定です。

関連リンク

2006-05-21

[][]PowerShell ObjectViewer(2)

ソースコードの解説

PowerShell ObjectViewer(1) - PowerShell Memoで紹介した「PowerShell ObjectViewer」のソースコード解説です。

対象ソースコード
 1  # コマンドを実行する
 2  function runCommand
 3  {
 4      $resultObj =  Invoke-Expression $txtObject.Text
 5      return $resultObj
 6  }
 7  
 8  # プロパティグリッドにオブジェクトを設定する
 9  function setObject
10  {
11      PARAM($setObj)
12      if($setObj -ne $null)
13      {
14          $pgObject.selectedobject=$setObj.PSObject.BaseObject
15          $title = $setObj.toString()
16          $frmMain.Text = $title
17          Write-Host $title
18      }
19  }
20  
21  # テキストボックス上で押されたキーをチェックする
22  function keyCheck
23  {
24      PARAM($keyEventArgs)
25      switch($keyEventArgs.KeyCode) 
26      {
27          ([System.windows.forms.Keys]::Enter) {setObject(runCommand)}
28          default{}
29      }
30  }
31  
32  # 初期処理
33  [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") 
34  
35  # フォーム設定
36  $frmMain = new-object system.windows.forms.form
37  $frmMain.Size = new-object System.Drawing.Size(600, 600)
38  
39  # テキストボックス
40  $txtObject = new-object System.Windows.Forms.TextBox
41  $txtObject.AutoSize = $false
42  $txtObject.Size = new-object System.Drawing.Size(600, 25)
43  $txtObject.Dock = [System.Windows.Forms.DockStyle]::Top 
44  $txtObject.Font = `
45      new-object System.Drawing.Font($txtObject.Font.SystemFontName, 14)  
46  $txtObject.Add_KeyDown({keyCheck($_)})
47  
48  # プロパティグリッド
49  $pgObject = new-object system.windows.forms.propertygrid
50  $pgObject.Dock = [System.Windows.Forms.DockStyle]::Fill
51  
52  # コントロール追加
53  $frmMain.Controls.Add($txtObject)
54  $frmMain.Controls.add($pgObject)
55  
56  # フォーム表示
57  $frmMain.showdialog()
アセンブリのロード
32  # 初期処理
33  [void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") 
  • Windowsフォーム用のアセンブリをロードしています。
  • フォーム、ボタン、各種コントロールを利用するために必要です。

以下は、ロード済みのアセンブリ情報を表示するスクリプトですが、アセンブリのロード後、実行すると、読み込まれている事が確認できます。

[System.AppDomain]::CurrentDomain.GetAssemblies()

フォームの生成
35  # フォーム設定
36  $frmMain = new-object system.windows.forms.form
37  $frmMain.Size = new-object System.Drawing.Size(600, 600)
  • 36行目:Formオブジェクトを生成し、37行目でサイズを決定しています。
  • 37行目:Seizeプロパティには「System.Drawing.Size」を代入します。
テキストボックスの生成
39  # テキストボックス
40  $txtObject = new-object System.Windows.Forms.TextBox
41  $txtObject.AutoSize = $false
42  $txtObject.Size = new-object System.Drawing.Size(600, 25)
43  $txtObject.Dock = [System.Windows.Forms.DockStyle]::Top 
44  $txtObject.Font = `
45      new-object System.Drawing.Font($txtObject.Font.SystemFontName, 14)  
46  $txtObject.Add_KeyDown({keyCheck($_)})
  • コマンド入力欄用のテキストボックスを設定しています。
  • 41行目:AutoSizeプロパティをfalseにしています。
    AutoSizeプロパティデフォルトがtrueですが、trueだと高さの変更ができません。
  • 42行目:はサイズの設定です。
  • 43行目:DockをTOPにすることで、フォームサイズを変更した際にテキストボックスの幅が自動でフィットするようになります。
  • 44〜45行目:フォントサイズの指定です。
  • 46行目:テキストボックスのKeyDownイベントのイベントハンドラを「keyCheck」ファンクションに設定しています。
  • 46行目:「keyCheck」ファンクションの引数に渡している「$_」には「KeyEventArgs」オブジェクトが格納されます。
    このオブジェクトを利用し、入力キーのチェックを行います。
プロパティグリッドの生成
48  # プロパティグリッド
49  $pgObject = new-object system.windows.forms.propertygrid
50  $pgObject.Dock = [System.Windows.Forms.DockStyle]::Fill
  • 50行目:DockをFillに指定し、フォームいっぱいに広がるように設定しています。
フォームへコントロールを追加、フォームの表示
52  # コントロール追加
53  $frmMain.Controls.Add($txtObject)
54  $frmMain.Controls.add($pgObject)
55  
56  # フォーム表示
57  $frmMain.showdialog()
  • 53〜54行目:コントロールをフォームへ追加しています。
  • 57行目:フォームの表示です。
入力キーのチェック
21  # テキストボックス上で押されたキーをチェックする
22  function keyCheck
23  {
24      PARAM($keyEventArgs)
25      switch($keyEventArgs.KeyCode) 
26      {
27          ([System.windows.forms.Keys]::Enter) {setObject(runCommand)}
28          default{}
29      }
30  }
  • テキストボックスの入力キーをチェックし、Enterキーを押された際にコマンドを実行します。
  • 25行目〜:入力キーは引数で渡された$keyEventArgs(KeyEventArgsオブジェクト)のKeyCodeプロパティに格納されています。
  • 27行目:入力キーの判定には[System.windows.forms.Keys]列挙体を利用します。
コマンドの実行
 1  # コマンドを実行する
 2  function runCommand
 3  {
 4      $resultObj =  Invoke-Expression $txtObject.Text
 5      return $resultObj
 6  }
  • 4行目:テキストボックスに入力されたコマンドを「Invoke-Expression」コマンドレットで実行しています。
  • 5行目:コマンドの実行結果を戻り値にしています。この戻り値プロパティグリッドに設定します。
プロパティグリッドオブジェクトを設定
 8  # プロパティグリッドにオブジェクトを設定する
 9  function setObject
10  {
11      PARAM($setObj)
12      if($setObj -ne $null)
13      {
14          $pgObject.selectedobject=$setObj.PSObject.BaseObject
15          $title = $setObj.toString()
16          $frmMain.Text = $title
17          Write-Host $title
18      }
19  }

2006-05-13

[][]PowerShell ObjectViewer(1)

「Powershell Analyzer」にインスパイア

PowerShellの開発環境 - PowerShell Memoで紹介した「Powershell Analyzer」では、

PowerShellの実行結果をPropertyGridに表示することで、実行結果を可視化してます。

PropertyGridってオブジェクトの全体像が簡単に把握できて良いですね。

特に、PowerShellに初めて触れるユーザにとって、取っ付き易いでしょう。


さて、PropertyGridを利用したサンプルを作ろうと考えたのですが、

「Powershell Analyzer」と同様、コマンド実行結果を可視化するのが最も有用・・・、

という安易な結論に達しました。(^^;


初心者向けPowerShell ObjectViewer


この「PowerShell ObjectViewer」は、テキストボックスにコマンドを入力して「Enter」を押すと、

実行結果をPropertyGridに表示するツールです。


「winlogonプロセス」の表示

f:id:newpops:20060513013539j:image


上の図は、

get-process | ?{$_.name -eq "winlogon"}

というコマンドを実行した結果です。


「get-process」で実行中の全てのプロセスをパイプで繋げて、「winlogon」という名前のプロセスだけにフィルタリングしています。

そして、PropertyGridに「winlogon.exe」のプロセスオブジェクト(System.Diagnostics.Process)を表示しています。

「new-objectコマンドレット」の表示

f:id:newpops:20060513013538j:image


上の図は、

get-command new-object

というコマンドを実行した結果で、

「new-object」コマンドレットオブジェクト(System.Management.Automation.CmdletInfo)を表示しています。


ちなみに、「ParameterSets」の右にある「(コレクション)」というカラムの一番右をクリックすると、

以下のダイアログが表示され、コレクションの要素を確認することができます。


f:id:newpops:20060513013537j:image

う〜ん・・・・。便利ですねえ。

ソースコード

ObjectViewer.ps1
# コマンドを実行する
function runCommand
{
    $resultObj =  Invoke-Expression $txtObject.Text
    return $resultObj
}

# プロパティグリッドにオブジェクトを設定する
function setObject
{
    PARAM($setObj)
    if($setObj -ne $null)
    {
        $pgObject.selectedobject=$setObj.PSObject.BaseObject
        $title = $setObj.toString()
        $frmMain.Text = $title
        Write-Host $title
    }
}

# テキストボックス上で押されたキーをチェックする
function keyCheck
{
    PARAM($keyEventArgs)
    switch($keyEventArgs.KeyCode) 
    {
        ([System.windows.forms.Keys]::Enter) {setObject(runCommand)}
        default{}
    }
}

# 初期処理
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") 

# フォーム設定
$frmMain = new-object system.windows.forms.form
$frmMain.Size = new-object System.Drawing.Size(600, 600)

# テキストボックス
$txtObject = new-object System.Windows.Forms.TextBox
$txtObject.AutoSize = $false
$txtObject.Size = new-object System.Drawing.Size(600, 25)
$txtObject.Dock = [System.Windows.Forms.DockStyle]::Top 
$txtObject.Font = `
    new-object System.Drawing.Font($txtObject.Font.SystemFontName, 14)  
$txtObject.Add_KeyDown({keyCheck($_)})

# プロパティグリッド
$pgObject = new-object system.windows.forms.propertygrid
$pgObject.Dock = [System.Windows.Forms.DockStyle]::Fill

# コントロール追加
$frmMain.Controls.Add($txtObject)
$frmMain.Controls.add($pgObject)

# フォーム表示
$frmMain.showdialog()

2006-05-10

[][]コマンドレットの作り方

tkinugawさん(MVP@Visual Developer - Visual Basic)のHPで、

「MONAD コマンドレットの作り方」という資料が公開されています。

タイトルはMonadですが、内容はPowerShellに対応しています。

「.NETでコマンドレットを作る」というテーマで、

ポイントをまとめた資料になっていますが、詳細は書いていません。

#この資料を元に手を動かしましょう。(^^;

2006-05-08

[]LIMIT OF LOVE 海猿

たまにはこんな話題でもいいよね・・・。

泣ける映画です・・・

「LIMIT OF LOVE 海猿」を見てきました。

映画第一作も、ドラマも見ていたので、今回の映画は「絶対見逃せないな」と思って気合いを入れて見に行ったのですが、

・・・その期待を遥かに上回る面白さでした。


映像面の迫力は言うまでもなく素晴らしいのですが、それ以上に、俳優さんの演技が熱かった。

これから見る人のために内容には詳しく触れませんが、「信念と葛藤」「友情と愛情」が痛烈に胸に響くような演技でした。

恥ずかしながら、私は、最後の30分は泣きっぱなしでしたよ…。(^^;


文字では伝わらない(私の言葉が拙い)と思いますので、ぜひ劇場でご覧になって下さい。

海猿最終作に相応しく、スケールの大きい感動的な映画に仕上がっています。

#どんなまとめだ?(^^;

2006-05-07

[][]「profile.msh」→「profile.ps1」

PowerShellの「profile」

profile.mshをカスタマイズする - PowerShell Memoで「profile.msh」について紹介しましたが、PowerShellになって「profile.msh」は「profile.ps1」に名前が変更になっています。


ファイル名、パスをまとめると以下のようになります。

ファイル名パス
Monadprofile.msh<マイドキュメント>\MSH
PowerShellprofile.ps1<マイドキュメント>\PSConfiguration

※oka326さんの記事を見て少し修正しました。(2006/05/07 23:48)

参考:Random thoughts on my interest


「prompt」の設定

「profile.ps1」の中で「prompt」ファンクションを記述することで、コマンドラインの先頭に表示する文字列(prompt)を設定できます。


私はpromptを以下のように設定しています。

function prompt
{
    $path = (get-location).Path
    $seprate = "\"
    $firstSeparate = $path.IndexOf($seprate)
    $lastSeparate  = $path.LastIndexOf($seprate)
    if ($firstSeparate -eq $lastSeparate)
    {
        "PS " + $path + "> "
    }
    else
    {
        "PS " + $path.substring(0,$firstSeparate+1) +  `
          ".." + $path.substring($lastSeparate) + "> "
    }
}

特徴としては、

  • カレントディレクトリの短縮表示(階層が3以上の時)
  • FileSystem以外のPSDriveにも対応

です。


ファイルシステムの表示例

カレントディレクトリが「C:\Program Files\Windows PowerShell」の場合

PS C:\..\Windows PowerShell>

レジストリの表示例

カレントディレクトリが「HKLM:\SOFTWARE\Microsoft\Windows」の場合

PS HKLM:\..\Windows>

2006-05-06

[][]PowerShellの開発環境

Powershell Analyzer

PowerShell(Monad)の開発環境で最もメジャーなのは、おそらく、Karl Prosser氏作成の「Powershell Analyzer」でしょう。

※つい先日まで「MSH Analyzer」という名前で公開されていたツールです。


「Powershell Analyzer」はフリーのPowerShell開発環境です。

  • IntelliSense機能(オートコンプリート)
  • アウトライン機能(コードの折りたたみ)

など、VisualStudio並の支援機能が搭載されています。

InteliSense機能

オブジェクトをPropertyGridで可視化

また、コマンドの出力結果をPropertyGridで表示する機能も備えています。

例えば、get-processコマンドを実行した場合であれば、実行されている各プロセスオブジェクトがPropertyGridで可視化できます。


さらに詳細な機能については、以下のFlashデモを参照下さい。



PrimalScript

有償の開発環境としては、PrimalScriptが次バージョンである4.1からPowerShellに対応するそうです。

http://www.primalscript.com/psnextpreview.asp

2006-05-05

[][]PowerShellの便利なエイリアス

これは便利

PowerShellになって、「%」と「?」という「エイリアス」が追加されました。

エイリアス定義
%foreach-object
?where-object

「%」の利用

「%」は「foreach-object」のエイリアスです。

通常、プロセス名を列挙する際、

ps | foreach-object{ $_.name }

または、

ps | foreach{ $_.name }

というコマンドを実行しますが、


これを「%」を利用して以下のように書くことができます。

ps | %{ $_.name }

「?」の利用

「?」は「where-object」のエイリアスです。

例えば、「win」で始まるプロセス名を列挙する際、

ps | where-object{ $_.name -like "win*" }

または、

ps | where{ $_.name -like "win*" }

と実行するところを、

「?」を利用して以下のように書くことができます。

ps | ?{ $_.name -like "win*" }


foreachやwhereは利用頻度が高いので、「%」「?」のように1文字で代替できるのは便利ですね。