Upgrade to Pro — share decks privately, control downloads, hide ads and more …

"オブジェクト"から学ぶPowerShell

 "オブジェクト"から学ぶPowerShell

2016/04/23に行われた2016/04/23 CLR/H #99 ~サクラサク~
で発表した内容になります。

セッションで使用したコードは
https://github.com/stknohg/PowerShellSamples/tree/master/community/clrh99
に上げています。

Takuya Shibata

April 23, 2016
Tweet

More Decks by Takuya Shibata

Other Decks in Technology

Transcript

  1. 自己紹介  素敵なおひげ ◦Twitter - @stknohg ◦Blog - http://stknohg.hatenablog.jp/ 

    何者? ◦CLR/HとJAZUG札幌(きたあず)の裏方です。 ◦札幌市内のSI屋さんで働いてます。 ◦PowerShell絶賛勉強中! 2
  2. PowerShell  オブジェクトなのでメソッドも呼べる  また、従来のSystem.DateTime型には無い プロパティを持っていたりする 14 # AddDaysメソッドを呼び出して翌日の日付を取得 $Tomorrow

    = $Now.AddDays(1) Write-Output $Tomorrow # 本来System.DateTime型のオブジェクトには無い # DisplayHintプロパティを使用することができる Write-Output $Now.DisplayHint
  3. PowerShellのオブジェクト  PowerShellでは.NET Frameworkの型を もつオブジェクトを扱う  純粋な.NET Frameworkのオブジェクトとは 異なり独自のプロパティを拡張可能(ETS) 

    そして、.NET Frameworkをベースにして ◦ WMI ◦ COM ◦ ADSI ◦ ADO.NET ◦ XML など のオブジェクトを統一的に扱える(ATS) 15 ※本セッションではETS/ATSの詳細には触れません
  4. ストリームと標準入出力  PowerShellのストリーム ◦ PowerShellではオブジェクトを入出力するため、 他のシェルとは異なり標準入出力に相当する 部分はストリームと呼ばれる  ストリームと標準入出力 ◦

    ストリームと標準入出力は似ているが別物 ◦ PowerShellと外部のExeが連携する場合、 ストリーム(オブジェクト) ⇔ 標準入出力(テキスト) の変換が発生する 18
  5. PowerShellのストリーム ストリーム リダイレクト 出力方法 Version 特記事項 Input - - All

    標準入力に相当 Standard output 1> Write-Output など All 標準出力に相当 “出力ストリーム” Error output 2> Write-Error All 標準エラー出力に相当 “エラーストリーム” Warning output 3> Write-Waring 3.0以上 Verbose output 4> Write-Verbose 3.0以上 Debug output 5> Write-Debug 3.0以上 Information 6> Write- Information 5.0以上 Write-Hostの結果が ストリームに乗る様に Progress - Write-Progress All 19
  6. ストリーム標準入出力  PowerShell → 外部Exe ◦ コンソールに表示される文字列を 標準入力へ渡す ◦ $OutputEncoding

    で設定されている エンコーディング(デフォルト ASCII)でエンコード ◦ 最後に必ず改行(CRLF)が付く  外部Exe → PowerShell ◦ 標準出力を文字列([stirng[]]型)に変換 ◦ [Console]::OutputEncoding で設定されている エンコーディング(デフォルト MS932)でエンコード ◦ バイナリ出力も文字列化される 20
  7. コマンドレット(Cmdlet)とは  簡単に言うとPowerShellの内部コマンド ◦ 組み込み済み+自作可能  実体は.NET Frameworkのクラス ◦ [System.Management.Automation.Cmdlet]

    クラスを継承したもの  格納単位はスナップインまたはモジュール (Dll or psm1) ◦ ただし、スナップインはもうほとんど使われない ◦ モジュールだけ覚えておけば良い 24
  8. 関数(ファンクション)の種類 1. 関数(ファンクション) 通常の関数 2. 高度な関数 PowerShell 2.0から利用可能 ファンクションにコマンドレットと同等の属性を付ける 事ができる様になったもの

    3. フィルター パイプラインでパイプすることを前提とした簡易的な関数 4. ワークフロー PowerShell 3.0から利用可能 ワークフロー用の特殊な関数 27 ※本セッションではワークフローには触れません
  9. (補足) コマンドレットの命名規則  コマンドレットには [Verb]-[Noun] な 命名規則が採用されている ◦ 例) Write-Output

     [Verb]については”Get-Verb”コマンドレット で使用すべき動詞を取得できる ◦ 使用すべきでない動詞を使ったモジュールを 公開すると警告が出る  [Noun]については自由 29
  10. (補足) コマンドレットの命名規則  これは “コマンドレット” に対する規則 なので “関数” は従わなくても問題ない 

    ただし、従った方が統一感が出て良い ◦ 私見では公開する関数は [Verb]-[Noun]な名前にするのが良いと考える 30
  11. PowerShellのパイプライン  動作例 35 > @(1..5) | Command1 | Command2

    Command1 Command2 Begin Process End Begin Process End Int[] 配列 1 2 3 4 5 1 2 3 4 5 6
  12. Write(Get) | Format | Out  PowerShellではストリームに出力された オブジェクトは原則、 1. Format-*なコマンドレットによって

    表示書式が設定され 2. Out-*なコマンドレットによって コンソールやファイル等へ文字列の 最終出力が行われる  これらのコマンドレットは明示的または 暗黙的にパイプラインでパイプされる 39
  13. Write(Get) | Format | Out  明示的な実行例  暗黙的な実行例 40

    # Get-ChildItem(ls)の実行例 Get-ChildItem | Format-Wide | Out-Host # Out-* を明示しない場合 Get-ChildItem | Format-Wide # Format-* Out-* を明示しない場合 Get-ChildItem
  14. Format-*なコマンドレット 名称 表示形式 特記事項 Format-List リスト形式 Format-Table 表形式 Format-Wide 複数列形式

    Format-Custom 独自の表示形式 Update-FormatDataで 書式を設定 Format-Defualt 既定の フォーマット PowerShell内部用 Format-*を明示しない場合 に内部的に使用される 41
  15. Out-*なコマンドレット 名称 出力先 特記事項 Out-Host ホスト(=実行環境) PowerShellコンソール、 PowerShell ISEなど Out-File

    ファイル Out-GridView グリッド形式のウィンドウ Foramt-*からパイプすると エラーになる Out-Null 出力なし /dev/null に相当 Out-Printer プリンター Out-String 書式設定されたオブジェクト を文字列に変換し出力 これだけ例外的に後続に パイプすることが可能 Out-Default 既定の出力 Out-Hostと同等 Out-*を明示しない場合に 暗黙的に呼び出される 44
  16. まとめ 1. PowerShellは.NET Frameworkの型をベース としたオブジェクトを扱う 2. PowerShellでは標準入出力に相当するもの はストリームと呼ばれ、オブジェクトを入出力 する 3.

    PowerShellのコマンドと関数はオブジェクトを 扱う 4. PowerShellのパイプラインはオブジェクトを パイプする 5. PowerShellのオブジェクトはFormat-*なコマン ドレットにより書式指定され、Out-*なコマンド レットで文字列として最終出力される 46
  17. 参考資料  Windows PowerShell Language Specification Version 3.0 ◦ https://www.microsoft.com/en-us/download/details.aspx?id=36389

     PSObject and the Adapted and Extended Type Systems (ATS and ETS) ◦ https://blogs.msdn.microsoft.com/besidethepoint/2011/11/22/psobject-and-the-adapted- and-extended-type-systems-ats-and-ets/  PowerShellのストリームと標準入出力、リダイレクトとパイプラインの話 ◦ http://stknohg.hatenablog.jp/entry/2015/06/26/001944  Windows PowerShell: 高度な関数のライフサイクル ◦ https://technet.microsoft.com/ja-jp/magazine/hh413265.aspx  Write-HostとWrite-Outputの違い ◦ http://stknohg.hatenablog.jp/entry/2016/01/11/151201  about_Format.ps1xml ◦ https://technet.microsoft.com/ja-jp/library/hh847831.aspx 47