[Tips]指定したパラメータを持つコマンドレット一覧を取得する

訳あって、特定のパラメータを持つコマンドレットの一覧が取得したかったので、下記のような関数を作ってみました。(PowerShell V2 CTP3で動作確認済み)。 関数名はいまいちなので好みに合わせて変更してください。

function Get-XParamCmdlet([string]$paraname)
{
  $CmdCnt = 0
  Get-Command -CommandType cmdlet |
  %{
    $a = Get-Command $_.Name | select Parameters
    if ( $a.Parameters.Keys -contains $paraname)
    {
      $_.Name
      $CmdCnt += 1
    }
  }
  "$CmdCnt 個見つかりました"
} 

この関数は、引数にパラメータ名を指定します。

たとえば、Encodingというパラメータを持つコマンドレットは下記のようにして取得します。

PS> Get-XParamCmdlet "Encoding"
Add-Content
Export-Clixml
Export-Csv
Export-PSSession
Get-Content
Out-File
Select-String
Send-MailMessage
Sent-Content
9 個見つかりました

関数の中身についてちょっと補足します。

まずGet-Commandでコマンドレットのパラメータコレクションを取得します。

つぎに取得したコレクションに対して、-containsを使用して指定されたパラメータが含まれているかをif文で判断しています。

もう少し、スマートに書くことができるような気がするのですが、その辺はご自身で調整ください。

 

これで、特定のパラメータを持つコマンドレットを調べることができますので、ぜひお試しください。

[PowerShell V2 CTP3] カスタムメニューをスクリプトから実行する

今回は、PowerShell ISEに追加したカスタムメニューをスクリプトから実行する方法について説明します。

カスタムメニューを追加する方法については 「PowerShell ISEにカスタムメニューを追加する方法」を参照ください。

まずは、下記のように入力してカスタムメニューを作成します。

#カスタムメニューに[Get-Date]というメニューアイテムを追加
$psISE.CustomMenu.Submenus.Add("Get-Date", {Get-Date}, "Ctrl+D")

#カスタムメニューに[日時]というメニューアイテムを追加
$parentmenu = $psISE.CustomMenu.Submenus.Add("日時", $null, $null)
#[日時]の子として[昨日][今日][明日]を追加
$parentmenu.Submenus.Add("昨日",{(Get-Date).AddDays(-1)}, $null)
$parentmenu.Submenus.Add("今日",{(Get-Date).AddDays(0)}, $null)
$parentmenu.Submenus.Add("明日",{(Get-Date).AddDays(1)}, $null)

このようにして作成したカスタムメニューは下記のようになります。

カスタムメニューをスクリプトから実行する方法ですが、ExecuteScriptプロパティを使用します。

まずは [Get-Date]メニューの実行です。

[GetDate]メニューは $psIse.CustomMenu.Submenus[0] と表すことが出来ます。これを実行するには先頭にドットをつけて下記のように記述します。

PS> . $psIse.CustomMenu.Submenus[0].ExecuteScript
2009/04/17 9:00:00

次に[日時]の[明日]を実行してみましょう。 これは$psIse.CustomMenu.Submenus[1] .SubMenus[2] と表すことが出来るので

PS> . $psIse.CustomMenu.Submenus[1].SubMenus[2].ExecuteScript

とします。

補足:

ExecuteScriptはプロパティであるため、先頭にドットをつけないで使用した場合には、登録されているスクリプトが表示されます。

[PowerShell V2 CTP3] PowerShell ISEでのRead-Hostコマンドレット

通常の(ISEではない方)でRead-Hostコマンドレットを実行すると、カーソルが点滅して入力を促します。

PowerShell ISEの方でRead-Hostコマンドレットを実行すると、VBScriptとかのInputboxのようなダイアログが表示されます。

-Promptパラメータも使用可能なので

PS> $a = Read-Host “下記に文字列を入力してください”

のようにすると、下記のようにプロンプト付きで表示されます。

ちなみに、[X]ボタンを押したときと[Cancel]ボタンが押されたときは、入力したデータは返されません。(当然ですね)

[PowerShell V2 CTP3]PowerShell ISEの各ペイン設定

PowerShell ISEでは、各ペインの背景色およびフォント色を変更することが可能です。

色の指定は、色を表す文字列(”RED”や”BLUE”)での指定の他に、ARGB値による指定が可能です。
ARGB値の指定は2重引用符で括り、”#AARRGGBB” のような指定を行います。 (ARGBは各2桁で16進数で指定)


スクリプトペインの設定

スクリプトペインの背景色を変更する

$psISE.Options.ScriptPaneBackground = "RED"


アウトプットペインの設定

アウトプットペインは、背景色、フォント色、文字表示箇所の背景色の3種類の設定を行うことができます。

$psISE.Options.OutputPaneBackground = "BLUE" 
$psISE.Options.OutputPaneForeground = "RED" 
$psISE.Options.OutputPaneTextBackground = "YELLOW"


コマンドペインの設定

コマンドペインの背景色を設定する

$psISE.Options.CommandPaneBackGround = "YELLOW"


各ペインの設定を既定値に戻す

各ペインの設定を規定値に戻すには下記のようにします。

$psISE.Options.RestoreDefaults()

トークンカラーを変更する

トークンカラーとは、スクリプトペインとコマンドペインに表示する文字色のことです。

コメントやコマンドレットなどの単位で色を指定することが可能です。

このためにスクリプトペインとコマンドペインには一括してフォント色を設定できるプロパティはありません。

トークンカラーの指定は下記のようにして行います。

コメントを青色に変更する

$psISE.Options.TokenColors["COMMENT"] = "BLUE"

指定可能なトークンは下記の通りです

Token Color名 説明 既定色
Attribute 属性 Light Blue
Command コマンド Blue
Command Argument コマンド引数 Blue Violet
Command Parameter コマンドパラメータ Navy
Comment コメント Dark Green
Group End グループの終わり Black
Group Start グループの始まり Black
Keyword キーワード Dark Blue
Line Continuation 行継続 Black
Loop Label ループラベル Dark Blue
Member メンバ Black
New Line 改行 Black
Number 数値 Purple
Operator 演算子 Dark Gray
Statement Separator ステートメントセパレータ Black
String 文字列 Dark Red
Type Teal
Unknown phrase 不明句 Black
Variable 変数 Orange Red

フォントサイズとフォントの変更

下記のようにしてフォント名とサイズを変更すると、全ペインに反映されます。

$psISE.Options.FontName ="Arial"
$psISE.Options.FontSize = "20"

[PowerShell V2 CTP3] try – catch – finally

PowerShellのVer.1.0では、エラーをトラップする方法として trap ステートメントがあります。(trapについては こちら を参照ください)

PowerShell V2では、新たに try – catch – finally を使用して構造化例外処理を行うことができます。(VB.NET や C#ユーザーにはお馴染みですね。 )

構造化例外処理とは、実行時に発生するエラーの検出やその処理を行うことです。 

 

PowerShellにおける try – catch – finally の基本構文は

try
{
  #エラーが発生する恐れのあるコードブロック
}
catch [キャッチする例外]
{
  #エラーが発生した場合の処理を記述
}
finally
{
  #最後に必ず実行する処理を記述
}

キャッチする例外は[]の中に記述します。

複数の例外を一度に処理する場合は、[]で括った例外をカンマで区切って指定します。

catch [キャッチする例外1],[キャッチする例外2]
{
  #エラーが発生した場合の処理を記述
}

また例外は下記のように多段にすることも可能です。

catch [キャッチする例外1] 
{
#エラーが発生した場合の処理を記述
}
catch [キャッチする例外2] {
  #エラーが発生した場合の処理を記述
}

finallyは省略することも可能だということを覚えておいてください。

 

ファイル操作を使用した実例を下記に示します。

try
{
$path = "C:\Work\Test.txt"
$enc = [System.Text.Encoding]::GetEncoding("Shift_Jis")
$sr = New-Object IO.StreamReader($path, $enc]
}
catch [Exception]
{
#エラーが発生した場合の処理を記述
"エラーが発生しました"
}
finally
{
#最後に必ず実行する処理を記述
if ( $sr -ne $Null )
{
$sr.Close()
}
}

この例では例外をExceptionで一括して取得していますが、実際には FileNotFoundException などを使用して処理を細かく分けることも可能ですので、是非試してみてください。