[PowerShell V2 CTP3]PowerShell ISEのプロファイル

by HIRO 31. 3月 2009 22:13

PowerShellにはプロファイルと呼ばれるファイルがあります。

このファイルはPowerShellが起動する前に実行されるスクリプトファイルです。

いわばPowerShell専用のスタートアップファイルであり、毎回使用したい関数やエイリアスなどを登録しておくことで、自動でPowerShellコンソールに反映されます。(通常PowerShelコンソール上で作成した関数やエイリアスはPowerShellが閉じられた時点でその情報を失ってしまいます。)


PowerShell のプロファイル  

PowerShellのプロファイルは $profile という自動変数に代入されています。

通常

C:\Documents and Settings\ユーザー\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 

がプロファイルの場所となります。


PowerShell ISEのプロファイル 

PowerShell ISEにも同様にプロファイルを作成することができます。

PowerShell ISEのプロファイルは PowerShellコンソールのものとは別ファイルとなることに注意してください。

PowerShell ISEのプロファイルの場所は、PowerShell ISEを起動して $profile自動変数を確認します。

通常

C:\Documents and Settings\ユーザー\My Documents\WindowsPowerShell\Microsoft.PowerShellISE_profile.ps1 

がPowerShell ISEのプロファイル場所となります。


[Tips] PowerShell ISEでPowerShwellコンソールのプロファイルを使用する

&"C:\Documents and Settings\ユーザー\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1" 

の1行をMicrosoft.PowerShell_profile.ps1 に書いておくと PowerShell コンソールと同一の設定がPowerShell ISEに反映されます。

是非お試しください。

現在のレート 5.0 (1人)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

PowerShell V2 CTP3

仙台イベントへご参加いただいた皆様ありがとうございました。

by Administrator 30. 3月 2009 21:48

3/28(土)、INETA & techbank.jp & PowerShell from Japan & HIRO's.NET 主催による合同勉強会 in 仙台 が行われました。

セッションは

techbank.jp の nora さんによる、「デベロッパー向け SQL Server 3つの性能ポイント

PowerShell from Japan!! からは私 HIROによる「PowerShell 入門」

そしてマイクロソフト様からエバンジェリストの田辺様による 「Windows PowerShell V2 の新機能」

の3本立てでした。 

techbank.jpさんの方で、勉強会のストリームおよびセッション資料を公開していますので、興味がある方は是非ご覧ください。

広報活動にお手伝いいただいた方々、勉強会スタッフの皆様、来場いただいた皆様のおかげで成功に納めることができました。

この場を借りてお礼申し上げます。

 

最後に、年内にPowerShell from Japan!! 主催で「PowerShellを1日で学んじゃおう勉強会」をできたらな、と考えております。

開催が決定したらお知らせしますので、その際にはぜひご参加いただければと思います。

 

現在のレート 5.0 (2人)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags:

PowerShellで作るdeliciousクライアント ラスト

by 山口 16. 3月 2009 14:52

前回の続きです。

タグの一覧を取得

タグの一覧を取得する機能を実装します。

まずは「DeliciousTag.vb」というファイル名でクラスファイルを追加します。

DeliciousTag.vb
Public Class DeliciousTag
     Private _name As String

     Public Property Name() As String
         Get
             Return _name
         End Get
         Set(ByVal value As String)
             _name = value
         End Set
     End Property

     Private _count As Integer
     Public Property Count() As Integer
         Get
             Return _count
         End Get
         Set(ByVal value As Integer)
             _count = value
         End Set
     End Property
End Class

このクラスはタグの情報を格納します。

DeliciousクラスにGetTagsという名前でメソッドを定義します。

Delicious.vb
Function GetTags() As List(Of DeliciousTag)
     Dim address = "https://api.del.icio.us/v1/tags/get"

     Dim contents = GetContents(address)
     Dim xml = XDocument.Parse(contents)
     Dim results = From ele In xml.Descendants("tag") _
                   Select New DeliciousTag With { _
                     .Name = ele.Attribute("tag"), _
                     .Count = ele.Attribute("count") _
                   }

     Return results.ToList()
End Function

Private Function GetContents(ByVal address As String)
     Dim wc = New Net.WebClient()
     wc.Credentials = _credential
     wc.Encoding = Text.Encoding.UTF8

     Return wc.DownloadString(address)
End Function

処理的には特に説明する必要がありませんね。

ちなみにWebClientを使ってリクエストを送る処理をGetContentsというメソッドに分離しておきました。

後は、このメソッドをプロバイダークラスから呼び出すように変更します。


GetChildItemsParametersクラスにTagOnlyというプロパティを追加します。 このパラメータが指定された時だけタグ一覧を出力するという感じです。

DeliciousProvider.vb
Private Class GetChildItemsParameters
     Private _start As Integer = 0
     <Parameter(Position:=0)> _
     Public Property Start() As Integer
         Get
             Return _start
         End Get
         Set(ByVal value As Integer)
             _start = value
         End Set
     End Property

     Private _count As Integer = 20
     <Parameter(Position:=1)> _
     Public Property Count() As Integer
         Get
             Return _count
         End Get
         Set(ByVal value As Integer)
             _count = value
         End Set
     End Property

     Private _tag As String()
     <Parameter(Position:=2)> _
     Public Property Tag() As String()
         Get
             Return _tag
         End Get
         Set(ByVal value As String())
             _tag = value
         End Set
     End Property

     Private _tagOnly As SwitchParameter
     <Parameter()> _
     Public Property TagOnly() As SwitchParameter
         Get
             Return _tagOnly
         End Get
         Set(ByVal value As SwitchParameter)
             _tagOnly = value
         End Set
     End Property
End Class

GetChildItemsメソッドを以下のように変更します。

DeliciousProvider.vb
Protected Overrides Sub GetChildItems(ByVal path As String, ByVal recurse As Boolean)
     Dim dynaParams = CType(DynamicParameters, GetChildItemsParameters)

     If dynaParams.TagOnly.IsPresent Then
         For Each tag In Me.Delicious.GetTags()
             WriteItemObject(tag, path, False)
         Next
     Else
         For Each bookmark In Me.Delicious.GetBookmarks(dynaParams.Start, dynaParams.Count, dynaParams.Tag)
             WriteItemObject(bookmark, path, False)
         Next
     End If
End Sub

TagOnlyプロパティが指定された時だけタグを取得して、出力していますね。 

タグの情報を見易く表示する為に書式設定ファイルにDeliciousTagクラスの設定を追加しておきます。

psdelicious.format.ps1xml
<?xml version="1.0" encoding="utf-8" ?>
<Configuration>
     <ViewDefinitions>
         <View>
             <Name>Tags</Name>
             <ViewSelectedBy>
                 <TypeName>PSDelicious.DeliciousTag</TypeName>
             </ViewSelectedBy>
             <TableControl>
                 <TableHeaders>
                     <TableColumnHeader>
                         <Label>タグ名</Label>
                     </TableColumnHeader>
                     <TableColumnHeader>
                         <Label>タグ数</Label>
                     </TableColumnHeader>
                 </TableHeaders>
                 <TableRowEntries>
                     <TableRowEntry>
                         <TableColumnItems>
                             <TableColumnItem>
                                 <PropertyName>Name</PropertyName>
                             </TableColumnItem>
                             <TableColumnItem>
                                 <PropertyName>Count</PropertyName>
                             </TableColumnItem>
                         </TableColumnItems>
                     </TableRowEntry>
                 </TableRowEntries>
             </TableControl>
         </View>
         <View>
             <Name>Tags</Name>
             <ViewSelectedBy>
                 <TypeName>PSDelicious.DeliciousBookmark</TypeName>
             </ViewSelectedBy>
             <ListControl>
                 <ListEntries>
                     <ListEntry>
                         <ListItems>
                             <ListItem>
                                 <Label>タイトル</Label>
                                 <PropertyName>Title</PropertyName>
                             </ListItem>
                             <ListItem>
                                 <Label>URL</Label>
                                 <PropertyName>Url</PropertyName>
                             </ListItem>
                             <ListItem>
                                 <Label>コメント</Label>
                                 <PropertyName>Comment</PropertyName>
                             </ListItem>
                             <ListItem>
                                 <Label>タグ</Label>
                                 <PropertyName>Tags</PropertyName>
                             </ListItem>
                             <ListItem>
                                 <Label>更新日付</Label>
                                 <PropertyName>Date</PropertyName>
                             </ListItem>
                         </ListItems>
                     </ListEntry>
                 </ListEntries>
             </ListControl>
         </View>
     </ViewDefinitions>
</Configuration>

これで、以下のようにするとタグの一覧を表示することができます。

PS  > dir -TagOnly

タグ名 タグ数 ------ ------ .NET 67 ADO.NET 3 AIR 2 AOP 1 API 2 ASP.NET 19 ActionScript 1 Ajax 2 Apache 3 AppEngine 4

残りの機能を一気に実装します。


タグの編集と削除

DeliciousクラスにDeleteTagRenameTagというメソッドを追加します。

Delicious.vb
Sub DeleteTag(ByVal tag As String)
     Dim address = "https://api.del.icio.us/v1/tags/delete?tag=" + Web.HttpUtility.UrlEncode(tag)

     Dim contents = GetContents(address)
     Dim result = GetResult(contents)

     If result <> "done" Then Throw New ArgumentException(result)
End Sub

Sub RenameTag(ByVal oldValue As String, ByVal newValue As String)
     Dim address = String.Format( _
         "https://api.del.icio.us/v1/tags/rename?old={0}&new={1}", _
         Web.HttpUtility.UrlEncode(oldValue), Web.HttpUtility.UrlEncode(newValue) _
     )
     Dim contents = GetContents(address)
     Dim result = GetResult(contents)

     If result <> "done" Then Throw New ArgumentException(result)
End Sub

Private Shared Function GetResult(ByVal contents As String) As String
     Dim result = Text.RegularExpressions.Regex.Match( _
         contents, "<result>(?<msg>.*?)</result>", Text.RegularExpressions.RegexOptions.Multiline _
     )
     Return IIf(result.Success, result.Groups("msg").Value, String.Empty)
End Function

見たまんまですね。

RemoveItemParametersクラスにTagNameというプロパティを追加します。 このパラメータが指定されたらタグを削除するようにします。

DeliciousProvider.vb
Private Class RemoveItemParameters
     Private _bookmark As DeliciousBookmark
     <Parameter(Position:=0, ValueFromPipeline:=True)> _
     Public Property Bookmark() As DeliciousBookmark
         Get
             Return _bookmark
         End Get
         Set(ByVal value As DeliciousBookmark)
             _bookmark = value
         End Set
     End Property

     Private _tagName As String
     <Parameter()> _
     Public Property TagName() As String
         Get
             Return _tagName
         End Get
         Set(ByVal value As String)
             _tagName = value
         End Set
     End Property
End Class

RemoveItemメソッドを以下のように変更します。

DeliciousProvider.vb
Protected Overrides Sub RemoveItem(ByVal path As String, ByVal recurse As Boolean)
     Dim dynaParams = CType(Me.DynamicParameters, RemoveItemParameters)

     If String.IsNullOrEmpty(dynaParams.TagName) Then
         Me.Delicious.DeleteBookmark(dynaParams.Bookmark.Url)
     Else
         Me.Delicious.DeleteTag(dynaParams.TagName)
     End If
End Sub

これで以下のようにして、タグを削除する事ができます。

PS delicious:\> del -Tag .NET

SetItemParametersクラスにTagというプロパティを追加します。このパラメータが指定されたらタグ名を変更するようにします。

DeliciousProvider.vb
Private Class SetItemParameters
     Private _bookmark As DeliciousBookmark
     <Parameter(Position:=0, ValueFromPipeline:=True)> _
     Public Property Bookmark() As DeliciousBookmark
         Get
             Return _bookmark
         End Get
         Set(ByVal value As DeliciousBookmark)
             _bookmark = value
         End Set
     End Property

     Private _share As SwitchParameter
     <Parameter(Position:=1)> _
     Public Property Share() As SwitchParameter
         Get
             Return _share
         End Get
         Set(ByVal value As SwitchParameter)
             _share = value
         End Set
     End Property

     Private _tag As SwitchParameter
     <Parameter()> _
     Public Property Tag() As SwitchParameter
         Get
             Return _tag
         End Get
         Set(ByVal value As SwitchParameter)
             _tag = value
         End Set
     End Property
End Class

SetItemメソッドを以下のように変更します。

DeliciousProvider.vb
Protected Overrides Sub SetItem(ByVal path As String, ByVal value As Object)
     Dim dynaParams = CType(Me.DynamicParameters, SetItemParameters)

     If dynaParams.Tag.IsPresent Then
         Me.Delicious.RenameTag(path, value.ToString())
     ElseIf Not value Is Nothing Then
         Me.Delicious.AddBookmark( _
             dynaParams.Bookmark, replace:=True, share:=dynaParams.Share.IsPresent _
         )
     End If
End Sub

これで以下のようにして、タグ名を変更することができます。

PS delicious:\> si -Tag .net .net-framework

これでだいたい当初予定していた機能は実装できたはずです。インターフェースはまだまだ煮詰める余地がありますが、普通に使えると思います。

最後の方は駆け足になってしまいましたが、PowerShellでのプロバイダ開発の実際のやり方がなんとなくつかめたのではないでしょうか。今回は基本的な機能しか実装していませんが、アイデア次第でいくらでも便利にする事ができます。

こういった拡張性の高さもPowerShellのプロバイダ開発の魅力だと思います。皆さんも試しに作ってみて下さい。楽しいですよ!!


ソース


目次

現在のレート 5.0 (1人)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

PowerShell

PowerShellで作るdeliciousクライアント その4

by 山口 12. 3月 2009 16:51

前回の続きです。

ブックマークの削除

今回はブックマークの削除機能から実装します。

DeliciousクラスにDeleteBookmarkという名前で、引数に削除するブックマークのURLを指定するメソッドを定義します。

Delicious.vb
Sub DeleteBookmark(ByVal url As String)
     Dim address = "https://api.del.icio.us/v1/posts/delete?url=" + Web.HttpUtility.UrlEncode(url)

     Dim wc = New Net.WebClient()
     wc.Credentials = _credential
     wc.Encoding = Text.Encoding.UTF8

     Dim contents = wc.DownloadString(address)
     Dim resultMsg = GetResultMessage(contents)

     If resultMsg <> "done" Then Throw New ArgumentException(resultMsg)
End Sub

Private Shared Function GetResultMessage(ByVal contents As String) As String
     Dim result = Text.RegularExpressions.Regex.Match( _
         contents, "<result code=""(?<msg>.*?)"" />", Text.RegularExpressions.RegexOptions.Multiline _
     )
     Return IIf(result.Success, result.Groups("msg").Value, String.Empty)
End Function

レスポンスのXMLから結果メッセージを取得する処理をGetResultMessageというメソッドに分離しておきました。

Remove-Itemコマンドレットのパラメータクラスをインナークラスで定義しておきます。

DeliciousProvider.vb
Private Class RemoveItemParameters
     Private _bookmark As DeliciousBookmark
     <Parameter(Mandatory:=True, Position:=0, ValueFromPipeline:=True)> _
     Public Property Bookmark() As DeliciousBookmark
         Get
             Return _bookmark
         End Get
         Set(ByVal value As DeliciousBookmark)
             _bookmark = value
         End Set
     End Property
End Class

後は、RemoveItemRemove-Itemコマンドレットに対応)メソッドをオーバーライドして、その中でDeleteBookmarkメソッドを呼び出すだけです。

DeliciousProvider.vb
Protected Overrides Sub RemoveItem(ByVal path As String, ByVal recurse As Boolean)
     Dim dynaParams = CType(Me.DynamicParameters, RemoveItemParameters)

     Me.Delicious.DeleteBookmark(dynaParams.Bookmark.Url)
End Sub

Protected Overrides Function RemoveItemDynamicParameters(ByVal path As String, ByVal recurse As Boolean) As Object
     Return New RemoveItemParameters()
End Function

これで以下のようにして、ブックマークを削除する事ができるようになります。

PS delicious:\> dir -Count 10 | del

次の機能に行く前に少しGet-ChildItemコマンドレットに機能を追加しておきます。


DeliciousクラスのGetBookmarksメソッドを以下のように変更します。

Delicious.vb
Function GetBookmarks(ByVal start As Integer?, ByVal count As Integer?, ByVal tags As String()) As List(Of DeliciousBookmark)
     Dim address = "https://api.del.icio.us/v1/posts/all"
     Dim queries = New Dictionary(Of String, Object)()
     If start.HasValue Then queries.Add("start", start.Value)
     If count.HasValue Then queries.Add("results", count.Value)
     If Not tags Is Nothing AndAlso tags.Length > 0 Then queries.Add("tag", String.Join(" ", tags))

     Dim wc = New Net.WebClient()
     wc.Credentials = _credential
     wc.Encoding = Text.Encoding.UTF8

     Dim contents = wc.DownloadString(JoinQueries(address, queries))
     Dim xml = XDocument.Parse(contents)
     Dim results = From ele In xml.Descendants("post") _
                   Select New DeliciousBookmark With { _
                     .Title = ele.Attribute("description"), _
                     .Url = ele.Attribute("href"), _
                     .Tags = CType(ele.Attribute("tag"), String).Split(" "), _
                     .Comment = ele.Attribute("extended"), _
                     .Date = ele.Attribute("time") _
                   }

     Return New List(Of DeliciousBookmark)(results)
End Function

「tags」という引数を追加して、タグ名でブックマークを検索できるようにしました。

Get-ChildItemコマンドレットのパラメータクラスにもTagプロパティを追加しておきます。

DeliciousProvider.vb
Private Class GetChildItemsParameters
     Private _start As Integer = 0
     <Parameter(Position:=0)> _
     Public Property Start() As Integer
         Get
             Return _start
         End Get
         Set(ByVal value As Integer)
             _start = value
         End Set
     End Property

     Private _count As Integer = 20
     <Parameter(Position:=1)> _
     Public Property Count() As Integer
         Get
             Return _count
         End Get
         Set(ByVal value As Integer)
             _count = value
         End Set
     End Property

     Private _tag As String()
     <Parameter(Position:=2)> _
     Public Property Tag() As String()
         Get
             Return _tag
         End Get
         Set(ByVal value As String())
             _tag = value
         End Set
     End Property
End Class

GetChildItemsメソッドを以下のように変更しておきます。

DeliciousProvider.vb
Protected Overrides Sub GetChildItems(ByVal path As String, ByVal recurse As Boolean)
     Dim dynaParams = CType(DynamicParameters, GetChildItemsParameters)

     For Each bookmark In Me.Delicious.GetBookmarks(dynaParams.Start, dynaParams.Count, dynaParams.Tag)
         WriteItemObject(bookmark, path, False)
     Next
End Sub

こうする事で、例えば以下のように「.net」というタグの付いたブックマークを10件取ってきて、それを一度に削除するという作業が一行でできるようになります。

PS delicious:\> dir -Tag .net -Count 10 | del

たいした事じゃないですけど、なんだか夢が広がりますね!! 

次はタグ関係を一気にやります。


ソース


目次

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

PowerShell

PowerShellで作るdeliciousクライアント その3

by 山口 12. 3月 2009 12:02

前回の続きです。

前回でブックマークの一覧を取得できるようにしましたが、あのままではURLがわかってもブラウザで開くという作業が面倒なので、その辺を簡略化できるように与えられたURLを既定のブラウザで開くコマンドレットを作っておきます。

「Commands」というフォルダを作成して、その中に「BrowseObjectCommand.vb」というファイル名でクラスファイルを追加します。

Commands\BrowseObjectCommand.vb
Namespace Commands
     <Cmdlet("Browse", "Object")> _
     Public Class BrowseObjectCommand
         Inherits PSCmdlet

         Private _url As String
         <Parameter(Mandatory:=True, Position:=0, ValueFromPipelineByPropertyName:=True)> _
         Public Property Url() As String
             Get
                 Return _url
             End Get
             Set(ByVal value As String)
                 _url = value
             End Set
         End Property

         Protected Overrides Sub ProcessRecord()
             Process.Start(Me.Url)
         End Sub
     End Class
End Namespace

PSCmdletクラスを継承します。コマンドレットである事を示す為にCmdletAttribute属性でマークしておきます。引数にはコマンドレットの動詞と名詞を指定します(Browse-Objectという書式になる)。

コマンドレットが実行されるとProcessRecordメソッドが呼び出されるので、これをオーバーライドして、その中ではURLプロパティをシェルで呼び出すだけです。

URLプロパティはParameterAttribute属性でマークして、必須属性(Mandatory:=True)、位置が0(Position:=0)、値をパイプラインから取得し、そのオブジェクトのプロパティと結びつけます(ValueFromPipelineByPropertyName:=True)。

このコマンドレットを使うと以下のようにして、URLをブラウザで開くことができるようになります。

PS delicious:\> dir -Count 1 | Browse-Object

ブックマークの追加・編集

ブックマークの追加・編集機能を実装します。

DeliciousクラスにAddBookmarkという名前で引数にDeliciousBookmark型を受け取るメソッドを定義します。

Delicious.vb
Sub AddBookmark(ByVal bookmark As DeliciousBookmark, _
                 Optional ByVal share As Boolean = False, Optional ByVal replace As Boolean = False)
     Dim address = "https://api.del.icio.us/v1/posts/add"
     Dim queries = New Dictionary(Of String, Object)()
     If String.IsNullOrEmpty(bookmark.Url) Then Throw New ArgumentException("[Url]を指定して下さい。")
     If String.IsNullOrEmpty(bookmark.Title) Then Throw New ArgumentException("[Title]を指定して下さい。")

     queries.Add("url", bookmark.Url)
     queries.Add("description", bookmark.Title)
     ' optional
     If Not String.IsNullOrEmpty(bookmark.Comment) Then queries.Add("extended", bookmark.Comment)
     If Not bookmark.Tags Is Nothing AndAlso bookmark.Tags.Length > 0 Then
         queries.Add("tags", String.Join(" ", bookmark.Tags))
     End If
     If Not bookmark.Date Is Nothing Then
         queries.Add("dt", bookmark.Date.Value.ToString("yyyy-MM-ddTHH:mm:ssZ"))
     End If
     queries.Add("shared", IIf(share, "yes", "no"))
     queries.Add("replace", IIf(replace, "yes", "no"))

     Dim wc = New Net.WebClient()
     wc.Credentials = _credential
     wc.Encoding = Text.Encoding.UTF8

     Dim contents = wc.DownloadString(JoinQueries(address, queries))
     Dim result = Text.RegularExpressions.Regex.Match( _
         contents, "<result code=""(?<msg>.*?)"" />", Text.RegularExpressions.RegexOptions.Multiline _
     )
     If result.Success Then
         Dim msg = result.Groups("msg").Value
         ' replaceを指定してね!
         If msg <> "done" Then Throw New ArgumentException(msg)
     End If
End Sub

Private Shared Function JoinQueries(ByVal address As String, ByVal queries As IDictionary(Of String, Object))
     If queries.Count = 0 Then Return address

     Return address + "?" + String.Join( _
         "&", queries.Select( _
             Function(q) String.Format("{0}={1}", q.Key, Web.HttpUtility.UrlEncode(q.Value)) _
         ).ToArray() _
     )
End Function

特に説明する必要は無いでしょう。単に「https://api.del.icio.us/v1/posts/add」というURLにリクエストを送っているだけです。

後、JoinQueriesメソッドのq.Valueを取得する部分をHttpUtilityクラスを使ってURLエンコードしておきました(System.Webアセンブリへの参照が必要です)。

使うとしたら、以下のようになるでしょうか。

Program.vb
Sub Main()
     Dim obj = New Delicious(New Net.NetworkCredential("ユーザ名", "パスワード"))
     Dim bookmark = New DeliciousBookmark With { _
         .Title = "google", _
         .Url = "http://www.google.co.jp" _
     }
     ' 共有して、上書きする。
     obj.AddBookmark(bookmark, share:=True, replace:=True)
End Sub

では、このメソッドをプロバイダークラスから呼び出すように変更しましょう。


このメソッドを呼び出すには山ほどパラメータが必要になるので 、(インナークラスで)パラメータクラスを作っておきます。

Delicious.vb
Private Class NewItemParameters
     Private _url As String
     <Parameter(Mandatory:=True, Position:=0)> _
     Public Property Url() As String
         Get
             Return _url
         End Get
         Set(ByVal value As String)
             _url = value
         End Set
     End Property

     Private _tags As String()
     <Parameter(Position:=1)> _
     Public Property Tags() As String()
         Get
             Return _tags
         End Get
         Set(ByVal value As String())
             _tags = value
         End Set
     End Property

     Private _comment As String
     <Parameter(Position:=2)> _
     Public Property Comment() As String
         Get
             Return _comment
         End Get
         Set(ByVal value As String)
             _comment = value
         End Set
     End Property

     Private _date As DateTime?
     <Parameter(Position:=3)> _
     Public Property [Date]() As DateTime?
         Get
             Return _date
         End Get
         Set(ByVal value As DateTime?)
             _date = value
         End Set
     End Property

     Private _share As SwitchParameter
     <Parameter()> _
     Public Property Share() As SwitchParameter
         Get
             Return _share
         End Get
         Set(ByVal value As SwitchParameter)
             _share = value
         End Set
     End Property
End Class

URLTagsCommentDateShareというプロパティを定義しています。それぞれParameterAttribute属性でマークして、必須属性にはMandatory:=TruePostion:=nで順番を指定しています。

後はNewItemNew-Itemコマンドレットに対応)メソッドをオーバーライドして、その中でAddBookmarkメソッドを呼び出すだけです。
NewItemDynamicParametersメソッドをオーバーライドして、NewItemParametersクラスのインスタンスを返しておく事をお忘れなく。

Delicious.vb
Protected Overrides Sub NewItem(ByVal path As String, ByVal itemTypeName As String, ByVal newItemValue As Object)
     Dim dynaParams = CType(Me.DynamicParameters, NewItemParameters)

     Dim bookmark = New DeliciousBookmark With { _
         .Title = path, _
         .Url = dynaParams.Url, _
         .Tags = dynaParams.Tags, _
         .Comment = dynaParams.Comment, _
         .Date = dynaParams.Date _
     }
     Me.Delicious.AddBookmark( _
         bookmark, replace:=Me.Force, share:=dynaParams.Share.IsPresent _
     )
     WriteItemObject(bookmark, path, False)
End Sub

Protected Overrides Function NewItemDynamicParameters(ByVal path As String, ByVal itemTypeName As String, ByVal newItemValue As Object) As Object
     Return New NewItemParameters()
End Function

追加に成功すれば(例外が投げられなければ)、DeliciousBookmarkオブジェクトをパイプラインに出力しておきます。


これで、以下のようにしてブックマークを追加する事ができるようになります。

PS delicious:\> ni google http://www.google.co.jp -Tags google -Comment テストです。

タイトル : google URL : http://www.google.co.jp コメント : テストです。 タグ : {google} 更新日付 :
PS delicious:\> dir -Count 1
タイトル : google URL : http://www.google.co.jp/ コメント : テストです。 タグ : {google} 更新日付 : 2009/03/12 4:30:46

次はブックマークを編集できるようにしておきます。


まずはSet-Itemコマンドレットのパラメータクラスをインナークラスで定義しておきます。

Delicious.vb
Private Class SetItemParameters
     Private _bookmark As DeliciousBookmark
     <Parameter(Mandatory:=True, Position:=0, ValueFromPipeline:=True)> _
     Public Property Bookmark() As DeliciousBookmark
         Get
             Return _bookmark
         End Get
         Set(ByVal value As DeliciousBookmark)
             _bookmark = value
         End Set
     End Property

     Private _share As SwitchParameter
     <Parameter(Position:=1)> _
     Public Property Share() As SwitchParameter
         Get
             Return _share
         End Get
         Set(ByVal value As SwitchParameter)
             _share = value
         End Set
     End Property
End Class

BookmarkShareというプロパティを定義しています。BookmarkプロパティはValueFromPipeline:=Trueにする事でパイプラインから取得できるようにしておきます。

後はSetItemメソッド(Set-Itemコマンドレットに対応)をオーバーライドして、その中でAddBookmarkメソッドをreplace:=Trueで呼び出しています。

Delicious.vb
Protected Overrides Sub SetItem(ByVal path As String, ByVal value As Object)
     Dim dynaParams = CType(Me.DynamicParameters, SetItemParameters)

     Me.Delicious.AddBookmark( _
         dynaParams.Bookmark, replace:=True, share:=dynaParams.Share.IsPresent _
     )
End Sub

Protected Overrides Function SetItemDynamicParameters(ByVal path As String, ByVal value As Object) As Object
     Return New SetItemParameters()
End Function

あと、Deliciousプロパティに一部不具合があったので、以下のように修正しておいて下さい。

Delicious.vb
Private _delicious As Delicious
Public ReadOnly Property Delicious() As Delicious
     Get
         If _delicious Is Nothing Then
             ' Me.PSDriveInfoプロパティでは駄目!!
             Dim driveInfo = Me.SessionState.Drive.Current

             _delicious = New Delicious(driveInfo.Credential.GetNetworkCredential())
         End If
         Return _delicious
     End Get
End Property

これで、以下のようにしてブックマークの情報を編集する事ができるようになります。

PS delicious:\> $bookmark = dir -Count 1
PS delicious:\> $bookmark.Title = "google.co.jp"
PS delicious:\> $bookmark | si

更新系のコマンドレットには、他にもRename-ItemMove-Itemがありますが、これらには対応しない事にします。

次はブックマークの削除機能を実装します。

次回に続く


ソース


目次

最新のブログ

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

PowerShell

Calendar

<<  3月 2010  >>
月曜火曜水曜木曜金曜土曜日曜
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

View posts in large calendar
Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in anyway.

© Copyright 2010 PowerShell from Japan!!