2009/12/03

PowerShellには色々な演算子がありますが、その中のひとつに、ある文字列が正規表現にマッチするかどうかを判定する-match演算子というのがあります。使い方は、

"文字列" -match "正規表現"

です。たとえば、文字列にGUIDが含まれるかどうかを調べるには

"これはGUIDを含む文字列です。771d8236-9cc9-46d0-b78c-571746f81393とかね!" -match "[A-Fa-f0-9]{8}\-[A-Fa-f0-9]{4}\-[A-Fa-f0-9]{4}\-[A-Fa-f0-9]{4}\-[A-Fa-f0-9]{12}"

とすると、Trueと表示されます。

ちなみに、一度-match演算子を使うと$matchesというHashtable型のシェル変数に、マッチ情報が入ります。この場合、$matches[0]にGUIDが入ります。サブ式を定義してある場合、$matches[1],$matches[2]...にそれらの値が入ります。ただし$matchesには最初のマッチ情報しか入らないので複数のマッチがある場合はあまり使えないです。素直に

$regex=[regex]"a" 
$regex.Matches("aaa")|ForEach{$_.value}

とかしたほうがいいです。

ところで、-match演算子の左辺には実は配列も指定できます。たとえば、

 "aa1","aaa","2","b" -match "\d"

とすると、

aa1
2

と表示されます。\dは数字が含まれるという正規表現ですが、これを配列に対してかけると、True/Falseではなくマッチした配列要素を返します。これ、私知らなかったんです!なかなか便利だと思うのでぜひつかってみてください。なおこの場合$matchesには何も入りません。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2009/12/03/183512.aspx

2009/10/28

というわけで、PowerShell 2.0が出ましたのでモジュールをなんか作ってみたいと思います。手ごろで最近熱いといえばやっぱりTwitterクライアントじゃないかなあと。というわけで題材はこれ。

設計的なもの

・PSプロバイダを実装することで実現

・よって、独自コマンドレットは必要最低限実装

・Get-ChildItemでタイムラインを表示

・タイムラインはTimeLineオブジェクトで表現

・発言はTweetオブジェクトとして表現

・TimeLineオブジェクトの中にTweetオブジェクトの配列が含まれる

・PSpathとしてはタイムラインの場合Twitter::Friendになり、発言の場合はTwitter::username\0000000とかになる

・Set-Locationでタイムライン移動(フレンドTL,リプライTL,DirectMessage,任意のユーザー)

・Get-Contentでタイムラインや発言を文字列として取得

・Invoke-Itemでブラウザを開く

・Remove-Itemで自分の発言削除

・New-Itemでポスト

・Set-ItemPropertyで発言をお気に入りに追加

・認証が必要な操作に関しては-credentialパラメータを使用。ただしデフォルト値はどこかに保持しておく

・ぱっと思いつく必要な独自コマンドレットはGet-FollowerとGet/New/Remove-Followingかな。返す値はTweetする人ということでTweeterクラスを作る

というわけで、非常にシンプルというか硬派なクライアントです。シェルでパイプラインを駆使してフィルターかけたりスクリプトを組んだり、ラッパーGUIを組んだり(!)すると色々楽しいと思います。

とりあえずモジュールのHello Worldまでメモ。

基本はPSスナップインを作るのと同じです。なので、詳細は

C#と諸々 コマンドレットの作成方法
http://csharper.blog57.fc2.com/blog-entry-55.html

をご覧ください。ここでスナップインクラスを作る、インストール、スナップイン登録という部分をまるっきり省けばOKです。

配置ですが、$pshome\Modulesに今回作るクライアント名であるPSTweetフォルダを作ります。そこにPSTweet.dllとPSTweet.psd1を配置します。psd1ファイルはこんな感じで良いようです。

@{
GUID="{847D070F-3247-46AB-BAE9-166038EFEA4B}"
Author="Daisuke Mutaguchi"
CompanyName="Winscript"
Copyright="© Daisuke Mutaguchi. All rights reserved."
ModuleVersion="1.0.0.0"
PowerShellVersion="2.0"
CLRVersion="2.0"
NestedModules="PSTweet"
RequiredAssemblies=Join-Path $psScriptRoot "PSTweet.dll"
}

あとはImport-Module PSTweetでシェルから読み込めます。

というわけでこれから作っていこうと思いますよ。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2009/10/28/182510.aspx


Copyright © 2005-2018 Daisuke Mutaguchi All rights reserved
mailto: mutaguchi at roy.hi-ho.ne.jp
プライバシーポリシー

Books

Twitter