2013/05/07

今週末5/11(土)にCommunity Open Day 2013 (COD 2013) というIT系コミュニティが集結するイベントが全国各地で同時開催されます。IT系コミュニティの活動をより広めるという目的で行われているCODは去年に続き2回目の開催となります。

私も大阪会場で、わんくま同盟大阪勉強会代表としてセッションを担当します。内容は以下の通りとなります。

タイトル:
運用自動化に役立つPowerShellモジュールの作成方法

内容:
Windows 8およびWindows Server 2012に標準搭載のPowerShell 3.0は、オリジナルのコマンドレット、PSプロバイダを含んだ「モジュール」を作成することで自由に機能拡張することができます。

アプリケーションの機能をコマンドレットを用いて実行できるようにしておくと、運用の自動化に役立ちます。

本セッションではVisual Studio 2012を使ってコマンドレットとPSプロバイダを開発し、モジュールを作成する方法について解説します。

当日はデモをまじえてPowerShellモジュール作成のキモをご紹介しようと思っています。

私のセッションの他にも、各コミュニティの方々による興味深いセッションが多数予定されております。

まだ残席ございますので、ご興味ありましたら是非、登録の上お越しくださいませ!

5/18追記。セッション資料セッションビデオを公開していますので、どうぞご利用ください。

2011/05/04

PSプロバイダをC#で実装する場合、NavigationCmdletProviderクラスなんかを継承させたクラスを作ってCmdletProvider属性をつけてやりますが、今回はその辺の話は省略して、このクラスからPowerShell変数を読み書きする方法について述べます。

たとえばそのPSプロバイダを含むモジュールを読み込んだPowerShellコンソールに変数$valを書き出すには、

this.SessionState.PSVariable.Set("val", 1);

のようにします。

逆にコンソールで読み込まれている変数$valの値を読み込むには、

PSVariable ret = this.SessionState.PSVariable.Get("val");

のようにします。

と、それだけなら話は簡単なのですが、実はPowerShellの仕組み上、そう単純には行きません。書き出しの方はさほど問題はないのですが、問題は読み込み。ここでretに格納されたオブジェクトから$valの実際の値を取得するにはどうすればいいでしょうか。

このコードを上から順に実行したら、ret.Valueにその値が入っているので、これを単にintにキャストすればOKです。

しかし$valがPowerShell側でその値が変更されていた場合は、ret.ValueにはPSObjectという、元の値をラッピングしたオブジェクトが格納されています。実際の値はPSObject.BaseObjectに格納されています。よって、(int)((PSObject)ret.Value).BaseObjectのように取得する必要があります。

めんどくさいのでメソッドにしてしまいました。

private T GetPSVariableValue<T>(string name)
{
    PSVariable variable = this.SessionState.PSVariable.Get(name);
    if (variable != null)
    {
        T obj;
        if (variable.Value is PSObject)
        {
            obj = (T)((PSObject)variable.Value).BaseObject;
        }
        else
        {
            obj = (T)variable.Value;
        }
        return obj;
    }
    else
    {
        return default(T);
    }
}

使い方は

int ret = GetPSVariableValue<int>("val");

みたいな感じです。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2011/05/04/198782.aspx

2010/05/20

PowerShell的システム管理入門
第3回 ファイル/レジストリの操作

http://www.atmarkit.co.jp/fwin2k/operation/pshsys03/pshsys03_01.html

よろしくお願いしますー。

ファイル、フォルダ操作、テキストファイル読み書き、レジストリ操作などの話題です。PSプロバイダという仕組みに基づいていろいろなリソースを同じコマンドレットで扱えるところがポイントですね。

そして5/29のわんくま大阪勉強会でPowerShellのコマンドレットとPSプロバイダを開発する話をやります。ファイル、レジストリ、Active Directory、そしてTwitter…。ご興味のある方はぜひご参加ください!

元記事:http://blogs.wankuma.com/mutaguchi/archive/2010/05/20/189218.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
プライバシーポリシー

Twitter

Books