2014/10/12

昨日10/11のPowerShell勉強会#4にお越しいただいた方、どうもありがとうございました。スタッフ一同、これからも定期的に開催していこうと考えておりますので、ぜひともよろしくお願い致します。

私のセッション資料を公開します。わんくま横浜で行ったものとほとんど同じですが、v5関係のスライドを少しだけ修正しています。

今回は高度な関数とコマンドレットの作り方を主に取り上げていますが、要するに、PowerShellコマンドはPowerShellスクリプトでもC#でもほぼ同じようにして同じようなものが書ける、ということなのです。なので、基本を押さえればどちらにも対応可能です。

両者は状況に応じて使い分ければOKかと思います。PowerShellよりC#が得意、というならばコマンドレットを書くと良いですし、スクリプト的なお手軽なコードで書きたい場合は高度な関数、とかですね。

速度が求められる部分とか、.NETアセンブリを多用する部分だけコマンドレットにして、他を高度な関数にする、あるいは、主要部はコマンドレットにして、その他はコマンドレットのラッパー的な高度な関数を用意する、のように両者を組み合わせたモジュールもよくあります。

以下はデモ用のサンプルスクリプトです。高度な関数の雛型的なものになります。使い方はスライド本文を参照してください。

function Get-Foo
{
    [CmdletBinding()]
    param([string[]]$Name)
    end
    {
        foreach($n in $name)
        {
            $out = [pscustomobject]@{
                Name = $n
                No = 0 
            }
            # PSCustomObjectのインスタンスに型名を付ける
            $out.PSTypeNames.Insert(0, "Winscript.Foo")
            $out
        }
    }
}

function Set-Foo
{
    [CmdletBinding()]
    param(
        [parameter(ValueFromPipeLine=$true, Mandatory=$true, Position=0)]
        [PSObject[]]
        $InputObject,
        [parameter(Position=1)]
        [string]
        $Property,
        [parameter(Position=2)]
        [PSObject]
        $Value,
        [switch]
        $PassThru
    )
    process
    {
        foreach($o in $InputObject)
        {
            $o.$Property = $Value
            if($PassThru)
            {
                $o
            }
        }
    }
}

# C#によるクラス定義
Add-Type -TypeDefinition @"
using System;
namespace Winscript
{
    public class Foo2
    {
        private string _name;
        private int _no;
        public Foo2(string name)
        {
            _name = name;
            _no = 0;
        }
        public string Name
        {
            get{
              return _name;  
            }
            set{
               _name = value; 
            }
        }
        public int No
        {
            get{
              return _no;  
            }
            set{
               _no = value; 
            }
        }
    }
}
"@

function Get-Foo2
{
    [CmdletBinding()]
    param([string[]]$Name)
    end
    {
        foreach($n in $name)
        {
           New-Object Winscript.Foo2 $n
        }
    }
}

function Set-Foo2
{
    [CmdletBinding()]
    param(
        [parameter(ValueFromPipeLine=$true, Mandatory=$true, Position=0)]
        [Winscript.Foo2[]]
        $InputObject,
        [parameter(Position=1)]
        [string]
        $Property,
        [parameter(Position=2)]
        [PSObject]
        $Value,
        [switch]
        $PassThru
    )
    process
    {
        foreach($o in $InputObject)
        {
            $o.$Property = $Value
            if($PassThru)
            {
                $o
            }
        }
    }
}

以下はデモで用いたC#のコードです。コマンドレットクラスの雛型的なものになっています。ビルドの際はSDKに含まれるPowerShell関係のdllを参照設定してください(詳しくはスライド)。また使用する際は、Import-Module ビルドで生成したdllのフルパス を実行してインポートして下さい。以下の例だとGet-Baz、Set-Bazの2コマンドレットがインポートされます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Management.Automation;

namespace Winscript
{
    [Cmdlet(VerbsCommon.Get, "Baz")]
    public class GetBazCommand : Cmdlet
    {
        [Parameter(Mandatory = false, ValueFromPipeline = false, Position = 1)]
        public string[] Name { get; set; }

        protected override void ProcessRecord()
        {
            foreach (var n in Name)
            {
                WriteObject(new Baz(n));
            }
        }
    }

    [Cmdlet(VerbsCommon.Set, "Baz")]
    public class SetBazCommand : Cmdlet
    {
        [Parameter(Mandatory = true, ValueFromPipeline = true, Position = 0)]
        public Baz[] InputObject { get; set; }

        [Parameter(Mandatory = true, ValueFromPipeline = false, Position = 1)]
        public string Property { get; set; }

        [Parameter(Mandatory = true, ValueFromPipeline = false, Position = 2)]
        public PSObject Value { get; set; }

        [Parameter(Mandatory = false, ValueFromPipeline = false)]
        public SwitchParameter PassThru { get; set; }

        protected override void ProcessRecord()
        {
            foreach(var o in InputObject)
            {
                if (Property == "No")
                {
                    o.No = (int)Value.BaseObject;
                }
                else if(Property == "Name")
                {
                    o.Name = (string)Value.BaseObject;
                }
                if (PassThru)
                {
                    WriteObject(o);
                }
            }
        }
    }

    public class Baz
    {
        private string _name;
        private int _no;
        public Baz(string name)
        {
            _name = name;
            _no = 0;
        }
        public string Name
        {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
        }
        public int No
        {
            get
            {
                return _no;
            }
            set
            {
                _no = value;
            }
        }
    }
}

2014/08/25

2014/08/23わんくま横浜#06にお越しいただいた方、どうもありがとうございました。

私の「PowerShellコマンドの書き方」というセッションの資料を公開します。

以下、セッション概要の再掲です。

PowerShellのコマンドを記述する方法としては、大きく分けて、.NET言語で記述する「コマンドレット」と、スクリプトで記述する「高度な関数」があります。
他言語の関数などと異なり、PowerShellのコマンドは他コマンドと連携させるためには、パイプラインの動作をきちんと把握して作成する必要があります。
今回はPowerShellのパイプラインの挙動と、それを踏まえたコマンドレットと高度な関数の書き方を解説します。
デモのお題としては、Friendlyを使ったUI操作自動化コマンドなんていかがですかね?

ところで、同内容のセッションを今度は関西でもやる予定です。詳細が決まり次第、ここで告知します。

9/9追記。http://winscript.jp/powershell/282に、本セッションで行ったデモ用のサンプルコードを公開しました。

2008/01/14

winscript - MyMiniCity
http://winscript.myminicity.com/

wankuma - MyMiniCity
http://wankuma.myminicity.com/

最近流行っているようなので便乗してみました。シムシティ2000風味ですか?よくわかってませんw wankuma cityも勝手に作っちゃいましたごめんなさい。

さて、仕事が忙しかったり沈没してたりでこっちにあんまり顔出せてませんが、2/16の講演は忘れてないので安心してください。デモ曲の作詞は完了して今作曲にとりかかっています。ミクにもちょっと歌わせてみましたがなかなかいいかんじでした。まぁ2コマあるので準備をちょっとがんばらないと色々まずいですが・・・(苦笑) そうそう、実は、初音ミクの開発元のクリプトン社さんからデモ用の初音ミクをお借りしました。デモ用ノートPCにばっちりインストールしましたよ!この場を借りて御礼申し上げます。当日はみなさんにミクが歌ってるところをお見せできるかと思います。

なお、当日はゲストスピーカーとしてやまにょん氏が遊びに(違)来てくれます。VSTiのマニアックな話をしてくれるそうですよ。たとえ私の講演がしょぼくてもきっとやまにょんがフォローしてくれるはずです。もうすぐ募集ページができると思いますのでまたよろしくお願いします。

そういえば関西の方で初音ミクに興味のある方は大阪電気通信大学でこんなイベントがありますよ。

2月10日(日)12:30〜14:30

「音声合成ソフト・初音ミク講演会」
特別ゲスト:クリプトン・フューチャー・メディア株式会社西尾公孝氏+声優 藤田咲氏

な、なんて豪華なんだ。中の人登場ですよ。今のところ申し込みも制限もないみたいなんでお時間ある方は行ってみるのもいいんじゃないでしょうか。私も行きますよーどんなに仕事が忙しくても!うちも負けてられませんがw

さて、また私事に戻りますが、そろそろ公表していいのかな?いいよね。めども立ってきたし。実はPowerShell本を書いています。初めての本です。3月末位に出せるといいなぁというスケジュールです。また詳細が決まり次第ここでご報告させていただきますね。(書名は決まってるんですがまだ秘密です)

荒井さんもPowerShell本を出されたのでそれに続く形になる・・・かな? ver2.0が出るまでに出るといいですね(ひとごとかよ!)

あ、あと独自ドメイン取りました。
http://winscript.jp/

まだ何もないですが将来的にはいろいろしようと思います。いろいろ・・・

whoisしても面白くないのであしからず。ではでは。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2008/01/14/117393.aspx

2007/11/05

体調が悪くてブログ更新とかWeb連載記事が止まっていてすみません。ほかの仕事もあまりできてませんし、オフラインイベントにも出てないですねー。

左半身(手足、顔など)がしびれたり震えたりしておかしいんです。あと胃腸の調子が悪くて…。

12/8は名古屋で、1月には大阪でスピーカーをやらせていただくので、それまでには治しておきたいところです。とりあえず検査中なのです。勉強会へのご参加お待ちしてます。

12/8と1月の講演はどちらも同じ内容でPowerShellがお題ですが、基礎編はちゃちゃっと流して少し「コマンドレットの組み合わせ」をテーマに応用に入ります。演題は「Windows PowerShell ステップアップ講座」にします。>中さんよろしくです

基礎編は大阪#5大阪#4などで復習しておいていただけると嬉しいです。

1月大阪は二コマいただいてまして、もう一コマで、「初音ミク」をテーマに少ししゃべろうかなと思ってます。初音ミクと作曲のイロハのイをやろうと思います。現在、検証中&調整中です。初音ミクは購入したんですが体験版が入手できなくてデモができるかどうか微妙なんですよ。でもデモできないと面白くない(というか意味があまりない)のでなんとか調整しますね。

作曲は自己流なので、講演もかなり偏ると思いますが、DTM(デスクトップミュージック)のここ10年の歴史をMIDIという単語をキーワードに少し語ったあと、素人でも、しかもお金をかけずともフィーリングで作曲できるということを示したいと思っています。そのあと、自作曲に乗せてミクさんに歌ってもらうという流れ。あ、どうしましょ、デモ用の曲を作らないと(汗

実は、すでにこんな曲を作ったりしていますがw
やまにょん氏と、謎の歌手largeさんsmallさんと組んで作った「まい☆びす」と「Happy! Lucky! Scripting!!」という電波ソングです。二つとも私が作詞、前者はやまにょん氏作曲、後者は私作曲です。

さて話はぜんぜんかわりますが、FizzBuzz問題(えぴさんとこにリンク)が解けて安心した人には、FizzBuzzDozz問題を解いてもらいます。私が今考えました。

【問題】
1から100までの数を表示するプログラムを書け。
ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
3と5両方の倍数の場合には「Dozz」とプリントすること。

FizzBuzz問題は実は数学を知らなくてもできますが、この問題を美しく解くには数学の知識が必要かもしれません。個人的には、FizzBuzzで素質を調べ、FizzBuzzDozzで発展性を調べるという感じですね。これができないと将来的にはつらくなってくると思います。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2007/11/05/105917.aspx


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

Twitter

Books