コマンドレットのパラメータを列挙してみる。埋め込み型のプレゼンテーションです。遅くなってすみません。新機能のご紹介」の資料を公開します。札幌は涼しくて、何もかも美味しくて良かったです。夏の関西は人間の生存に適した気候とはとても言えないので、しばらく札幌に滞在していたかったですね。5.1の正式版が利用できるようになるということで、今回、5.0に加えて5.1の新機能もご紹介することにしたためです。(スライドは5.1の新機能の部分以外は、基本的にこれまでの内容と同様です。TP5で試すことができます。2016正式リリースまでの期間がけっこう空いたことと、ラピッドリリースの方針もあって、5.1が短期間で登場することとなりました。Editionに分かれるところだと思います。Serverで動作させることを目的として作られました。Serverの管理はリモート経由でPowerShellを直接的あるいは間接的に用いて行うことになるため、当然ながら必須のコンポーネントとなります。Core上で動作します。Frameworkのサブセットで、マルチプラットフォームで動作し、OSSとして開発されています。Editionとしてこれまで通り利用可能です。5.0、5.1の新機能はMSDNでまとめられているのでそちらもご参照ください。(Preview)追伸。Managementを7月付で再受賞いたしました。おかげで今回のイベントで「関西MVP3人が集結」という触れ込みが嘘にならなくて良かったです。同じ分野でCLR/Hのスタッフでもある素敵なおひげさんも受賞されました。おめでとうございます。埋め込み型のプレゼンテーションです。第5回PowerShell勉強会でのセッション資料を公開します。Ignite期間中に発表になった情報をなるべく盛り込んでみました。以下は今回資料を作るのに参考にしたサイト、記事群の一部です。何はなくともリリースノート。まとまっていないので読みづらいです。Server関係は以下。ちなみにコンテナのPreviewは今夏だそうです。|Tweet(※12/22付記。12/21にこのセッションのブラッシュアップ版セッションを行いました。ついてのセッション(30分)をしてきました。以下が発表で使ったpptxの資料となります。新たに追加されたシステム管理機能です。拡張構文で記述します。「どういう結果になるべきか」で記述することができます。実行後に保証される状態を記述することができるので、プログラミングに明るくないシステム運用者の方にも抵抗なく使うことができると思います。開発者は従来通りアプリケーションの機能を呼び出すコマンドレットを作成するのに加えて、DSCで用いる「カスタムリソース」も実装することになります。実現のための道具の一つとなるものと思います。ついての情報、特に日本語のものがあんまりネット上に見当たらないので、このスライドを参考にしていただければいいかな、と思います。2012、最終日の記事です。前回はAdd-Typeコマンドレットを使って独自のクラスを作成し、そのクラスを入力あるいは出力型に取る関数をどのように記述すれば良いのか、というお話でした。今回は前回に残した課題である、ユーザー定義の独自型の出力にちゃんとした書式を設定する方法について説明していきます。型データと書式設定データPowerShellは.NETオブジェクト(に限らず、型アダプタが存在するCOMやXMLなども、ですが...)をラッピングした型システムを有しているわけですが、このラッピング時にオブジェクトに対してPowerShell独自のデータを付与することができます。それが型データと書式設定データと呼ばれるものです。型データはクラスにPowerShellエンジンが付加する独自のメンバ(プロパティ、メソッド)です。ScriptMethod(スクリプトで記述されたメソッド)があります。.types.ps1xmlファイルにその定義を記述し、モジュールならモジュールマニフェスト(.psd1)のTypesToProcessプロパティに型データファイルパスを指定することで、インポート時に型データを反映させることができます。Update-TypeDataコマンドレットで後から型データファイルを読み込んで反映することもできます。3.0ではUpdate-TypeDataコマンドレットで.types.ps1xmlファイルを読むのではなく、直接任意のメンバを任意の型に追加することも可能になっています。Extendedとすることで$objに追加されたメンバがどれなのかが分かります。(ちなみに型アダプタによって追加されたメンバはAdapted指定で分かります)今回の記事では型データについてはこれくらいにして(またいつか改めて取り上げたいですが)、以下、本題の書式設定データの話をしていきます。書式設定データとは書式設定データも型データと同様、クラスに付加するデータなのですが、これはオブジェクトを出力する際のデフォルトの表示フォーマットを定義するものとなります。AdminService...のようにProcessオブジェクトが表形式で表示されます。ここで表に含まれるプロパティ、IdとProcessNameは.NETのProcessクラスが持つオリジナルのプロパティで、HandlesはHandleCountプロパティのAliasPropertyです。NPMやWSなども対応するAliasPropertyやScriptPropertyが定義されているのですが、たとえばNPMというAliasPropertyはあってもNPM(K)というメンバはありません。これを定義しているのが書式設定データになるわけです。そもそもこの表に含まれるプロパティの種類であるとか、もっというとProcessオブジェクトは特に指定がない場合は表形式で表示する、といった定義も書式設定データに含まれます。書式設定データも型データと同様にXMLファイルに定義されるのですが、その拡張子は.format.ps1xmlです。モジュールならマニフェストのFormatsToProcessプロパティに.format.ps1xmlファイルのパスを指定することで表示に反映されますし、Update-FormatDataコマンドレットによって後から反映させることも可能です。この書式設定ファイルはユーザー定義型に関しても定義を記述できます。ユーザー定義型に対応する.format.ps1xmlファイルを記述し、それを読み込むことで、自分がAdd-Typeで作った型に対しても書式を設定できるわけです。次の節でそのやり方を見ていきましょう。書式設定データ.format.ps1xmlの書式についてはMSDNにリファレンスがあるので、これを読めば自分で一から作成することは可能です。それはちょっと面倒くさいので、既存の書式設定データをベースに、独自型用に修正していくのがお勧めです。書式設定データはGet-FormatDataコマンドレットで取得でき、Export-FormatDataコマンドレットでファイルとして出力できます。Export-FormatDataコマンドレットの出力XMLファイルは改行コードが入っていなくて見づらいので、XmlDocumentとして再度読み込んでSave()するという小細工を施すのがお勧めです。先ほどのProcessクラス(System.Diagnostics.Process)の書式設定データをファイル化するには以下のようなスクリプトを実行します。$ps1xml))このスクリプトを実行すると、Processクラスの書式設定データをprocess.format.ps1xmlファイルとして出力できます。ISE(ただしv3の)で開くのがお勧めです。XMLノードを折りたたみできるので。出力した.format.ps1xmlファイルをつらつらと眺めると、実際の出力書式の定義はビュー(View)という単位で行われていることがわかります。View要素の下にはName要素(ビューの名前)、ViewSelectedBy要素(ビューを反映する対象の型)、TableControl要素(表の書式)があります。TableControl要素の下にはTableHeaders要素とTableRowEntries要素が含まれており、前者は表のヘッダーに記載するラベルやその幅などをTableColumnHeader要素に一つ一つ定義し、後者は表の本体に表示するオブジェクトのプロパティ値をTableColumnItem要素に一つ一つ定義しています。TableColumnItem要素は単純にプロパティ値を表示させるならPropertyName要素にプロパティ名を書くだけでOKです。スクリプトの結果を表示させるならScriptBlock要素内にスクリプトを書きます。ScriptBlock要素内で自動変数$_に1オブジェクトが格納されています。結局のところ、表に表示したいプロパティの分だけ、TableColumnHeader要素(プロパティ名のラベル)とTableColumnItem要素(プロパティ値)を1:1で定義していけばOKです。以上を踏まえてprocess.format.ps1xmlを改変して、前回作成したWinscript.Driveクラスの書式設定ファイルdrive.format.ps1xmlを作成してみました。64このように定義した型のオブジェクトに対しても、綺麗な書式で出力することができるようになるわけです。まとめここまで全三回にわたって、「関数の定義」「型の定義」「出力書式の定義」の基本のきについて説明してきました。基本とはいえ、PowerShellでがっつりとちゃんとした関数を書く上で真っ先に押さえておかないといけないことばかりですし、逆にここまで必要最小限に絞った記事もあまりないかなと思い、まとめてみました。参考にしていただければ幸いです。PSアドベントカレンダー2012もこれで終わりです。皆様、よいクリスマス...はもう終わりなので、よいお年を!※終わりと言っておきながら実は明日以降、ロスタイムとしてもうひとかたご登場の予定です。Preview版と同時に提供が開始されました。今回のリリースでは日本語版も提供されています。betaの提供も始まりました。こちらは英語版のみの提供で、日本語環境にインストールするには英語言語パッケージをダウンロードし適用する必要があります。Detailsまだ評価を初めて間もない段階ですが、きづいた点をいくつか書いてみます。Preview/CTP版から大きく変わっており、コマンドを入力する「コマンドペイン」と結果が表示される「出力ペイン」が統合され、「コンソールペイン」となりました。こんな感じでコンソールペインはその名の通りコンソール版のPowerShellと見た目や使用感が似ている上にISEならではの機能(インテリセンスなど)が使用可能になっており、ISEはスクリプト編集のみならずインタラクティブシェルとしてpowershell.exeの代わりに使用する場合でもより便利になったと言えるでしょう。ISEのキーワード色分け設定は細かく指定できたりします。Directory管理センターの大幅な機能増強が目に留まります。履歴」ペインが追加され、GUIで操作した履歴がそのまま、再実行可能なPowerShellスクリプトとして表示されるようになりました。ユーザーを作成する作業をGUIでやります。するとその作業内容がこのように履歴ペインに表示されます。履歴はまさにPowerShellスクリプトそのままなので、これを「コピー」してISEに貼りつけるともうスクリプトファイルが完成します。あとは必要に応じてパラメータを変更したり、ループを設けて繰り返し処理をしたり、自由自在に再利用ができます。ここではユーザー名を”testuser2”に変えて実行してみました。最初にGUIで作ったユーザーと同じ設定を用いて複数のユーザーを作成することが簡単に行えます。ユーザー名を記載したCSVファイルを読み込んでそのユーザーを一括作成することなどもできますね(PowerShellにはImport-CsvというCSVファイルを扱うコマンドレットもあります)。スクリプトファイルにして保存すれば何回でも実行可能ですし、PSScheduledJobモジュールを使ってタスクスケジューラに登録すれば定期実行も可能です。履歴スクリプトのうち、どこからどこまでが「今やった作業」なのか分かりにくいこともあると思いますが、そういうときには履歴ペインの「タスクの開始」をクリックし、今からやりたい作業名をまずメモします。GUIで作業を行い、終わったら「タスクの終了」をクリックします。作業単位でこれを繰り返します。すべてが終わったら履歴をすべてコピーしてISEに貼りつけてみます。するとこのようにタスク名がコメント行として挿入され、スクリプトのどこからどこまでが、どの作業に対応しているかが明確になるわけです。Directoryに採用されたということになります。Directory管理センターも内部的にはそういう構造だったのですが、履歴をスクリプトとして取り出す方法がなかったのですが、Server8からは可能になったということになります。Serverなど限られた製品のみでしたが、今後はこちらの構造が主流になると思われます。GUIとCUIの「いいとこどり」ができるこの構造はなかなか理想的なシステムなんじゃないかと思います。OS管理の中核として重要度が高まっており、それに答えるように様々な機能増強が行われています。プレビューの各項目の記述内容の多くにPowerShellに関する記載があることでも分かるかと思います。*.logと書くことはできません。Rename-Itemコマンドレットの-pathパラメータと-newNameパラメータはワイルドカード文字を受け付けないからです。-fullを調べるとpathパラメータの「ワイルドカード文字を許可する」はfalseになってますが、実際はワイルドカードが使えます)。よってGet-ChildItemでワイルドカードを用いてファイル一覧を取得し、それをRename-Itemコマンドレットにパイプで渡すとよさそうです。ByPropertyName)」なので、パイプ経由でオブジェクトを渡すとこのパラメータに値が渡ります。ByValueなどの意味は以前書いたエントリを参考にしてください。*.logあれ、新しい名前のほうのワイルドカードはどうすればいいんだ?というわけでこれでは駄目で、まだ一工夫が必要です。素直に考えると、Get-ChildItemの結果(FileInfoオブジェクトの配列)をForEach-Objectで列挙して、その各要素でNameプロパティを元にRename-Itemコマンドレットを実行するというのが思いつきます。-replace演算子の右辺配列の最初の要素は正規表現を指定します。正規表現における特殊文字「.」は「\」でエスケープする必要があります。拡張子以外の文字が置き換わらないように文字列の末端を表す「$」を使用します。「$」はPowerShellにおいて特殊文字なので「`」でエスケープします。これはなんかNameプロパティの値を2回も参照してて冗長ですしあまりやりたくないですね。そもそもせっかくRename-Itemコマンドレットの-pathパラメータにパイプライン経由で直接オブジェクトを流し込める利点を生かせていません。そこで登場するのが、このエントリのタイトルにもある「スクリプトブロックパラメータ」です。実はPowerShellには任意のコマンドレットパラメータにスクリプトブロックを指定する機能があるのです。コマンドレットパラメータは型が指定されていますが、これが<scriptblock>である必要はなく、<string>でも<int>でも何でもOKです。したがって、冒頭の問題の回答は次のように記述することができます。"\.txt`$",".log"}このように、-newNameパラメータの型は<string>であるにも関わらず、スクリプトブロックを指定することができるのです。このスクリプトブロック内の$_は、パイプラインに渡されたオブジェクト配列の一要素です。ここではFileInfoオブジェクトになります。注:この例だとファイルはカレントディレクトリにあるものが対象になるので、カレントディレクトリ以外で実行する場合はNameプロパティの代わりにFullNameプロパティを使ってフルパスを指定してください。この機能、マイナーだと思いますが知っているとずいぶん楽になるケースが多いと思うので、ぜひ覚えておくことをお勧めします。実はこの例題、Rename-Itemコマンドレットのヘルプの例4そのままだったりします。私はそこの解説を読んでもいまいち仕組みが分かりませんでした。Blogsという記事を読んでようやくこれがPowerShellの機能だと認識した次第です。それでもrenコマンドのお手軽さには負けますけども、柔軟性に関してはもちろんPowerShellのほうが圧倒的に優れているのでそこは我慢するしかないのかなあ、と思います。*.logとかしてくださいませ。ちなみにこの機能はユーザーが定義した関数では原則使用できないようです。例外があって、次のような関数定義をしておくと大丈夫でした。}}ポイントはパラメータにparameter属性を指定して、ValueFromPipelineもしくはValueFromPipelineByPropertyNameを$trueにすることと、型名を指定すること(ここでは<string>)です。{$_.fullname}のようにして、コマンドレットの場合と同様にスクリプトブロックパラメータを使うことができます。属性と型指定どちらかが欠けているとスクリプトブロックが展開されずそのまま-strパラメータに渡ってしまうようです。2.0の文法、仕様などが詳しく書かれたドキュメント(英文)がMicrosoftから公開されました。2.0http://www.microsoft.com/downloads/en/details.aspx?FamilyID=509b77d0-5e5f-4194-a2d0-61648abfd093320ページのWordファイルです。私はさっそくダウンロードしてpdfで保存しました。(定義済みフィールドプロパティのローカライズの関係上、ヘッダの文字列にエラーが出ているので修正すると良いです。1」にすればOK)PowerShellの文法については公式ドキュメントが長らく公開されていませんでした。1.0のbeta版が公開されたときに付属していたのが公式から出された唯一のものだと思います(RC版からは現行ドキュメントに置き換え)。Promise」が適用されたことと関係があります。Promiseとは、Microsoftが自社開発のプログラミング言語などの特許権を行使しないという宣言で、すでにC#とCLIに適用されているものです。Promiseが適用され、サードパーティがPowerShell言語の実装を自由に行うことができるようになります。Windows以外のプラットフォーム上で動作するPowerShellを合法的に開発することも可能になります。Pashというオープンソースでマルチプラットフォーム対応のPowerShell実行環境のプロジェクトが存在しますが、このプロジェクトの進行を後押しする決定になると思われます。2.0が提供開始になりました。2008の場合では次のような表示になります。MBこの更新プログラムを有効にするには、コンピューターを再起動する必要があります。