Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
”オブジェクト”から学ぶ
PowerShell
2016/04/23 CLR/H #99 ~サクラサク~
素敵なおひげ
自己紹介
 素敵なおひげ
◦Twitter - @stknohg
◦Blog - http://stknohg.hatenablog.jp/
 何者?
◦CLR/HとJAZUG札幌(きたあず)の裏方です。
◦札幌市内のSI屋さんで働いてます...
はじめに
PowerShellは”オブジェクト“を扱う
シェルです。
今日はこの”オブジェクト“を通して
PowerShellの基本的な仕組みを
学びます。
3
アジェンダ
1.PowerShellのオブジェクト
2.ストリームと標準入出力
3.コマンドレット
4.PowerShellのパイプライン
5.オブジェクトの出力
4
本セッションでやらないこと
PowerShellの文法に関すること
◦細かい文法には触れません
スクリプトの書き方に関すること
◦コーディングはしません
コマンドの機能説明
◦個別の機能説明はしません
5
1. PowerShellのオブジェクト
6
他シェルとの比較
 PowerShellはオブジェクトを扱うシェル
 簡単なスクリプトで、
◦コマンドプロンプト(cmd.exe)
◦Bash
◦PowerShell
の三者の違いを比較する
7
コマンドプロンプト(cmd.exe)
 実行結果
8
> SET Now=%DATE%
> echo %Now%
コマンドプロンプト(cmd.exe)
1. %DATE%環境変数に設定されている
文字列の日付を%Now%変数に代入
2. echoコマンドで%Now%変数の内容を
標準出力に出力
3. 出力結果がそのままコンソールに
表示される
9
Bash
 実行結果
10
# Now=`date`
# echo $Now
Bash
1. dateコマンドを実行し、結果の文字列
を変数$Nowに代入
2. echoコマンドで$Now変数の内容を
標準出力に出力
3. 出力結果がそのままコンソールに
表示される
11
PowerShell
 実行結果
12
> $Now = Get-Date
> Write-Output $Now
PowerShell
1. Get-Dateコマンドレットを実行し、
System.DateTime型の結果を$Now変数
に代入
2. Write-Outputコマンドレットで$Now変数
の内容を出力ストリームに出力
3. 出力結果が文字列...
PowerShell
 オブジェクトなのでメソッドも呼べる
 また、従来のSystem.DateTime型には無い
プロパティを持っていたりする
14
# AddDaysメソッドを呼び出して翌日の日付を取得
$Tomorrow = $Now...
PowerShellのオブジェクト
 PowerShellでは.NET Frameworkの型を
もつオブジェクトを扱う
 純粋な.NET Frameworkのオブジェクトとは
異なり独自のプロパティを拡張可能(ETS)
 そして、.NE...
PowerShellのオブジェクト
PSObject
◦ [System.Management.Automation.PSObject]
◦ PowerShellで扱うオブジェクトの実体
◦ [System.Object]の様な基底クラスでは...
2. ストリームと標準入出力
17
ストリームと標準入出力
 PowerShellのストリーム
◦ PowerShellではオブジェクトを入出力するため、
他のシェルとは異なり標準入出力に相当する
部分はストリームと呼ばれる
 ストリームと標準入出力
◦ ストリームと標準入出...
PowerShellのストリーム
ストリーム リダイレクト 出力方法 Version 特記事項
Input - - All 標準入力に相当
Standard
output
1> Write-Output
など
All 標準出力に相当
“出力スト...
ストリーム標準入出力
 PowerShell → 外部Exe
◦ コンソールに表示される文字列を 標準入力へ渡す
◦ $OutputEncoding で設定されている
エンコーディング(デフォルト ASCII)でエンコード
◦ 最後に必ず改...
全体像
21
http://stknohg.hatenablog.jp/entry/2015/06/26/001944 より
3. コマンドレット
22
PowerShellのコマンド
 PowerShellは他のシェルと違い、
コマンドによる入出力はテキスト
ではなくオブジェクトになる
 このため、PowerShellには
オブジェクトを入出力する独自の
コマンド体系(コマンドレット)
が...
コマンドレット(Cmdlet)とは
 簡単に言うとPowerShellの内部コマンド
◦ 組み込み済み+自作可能
 実体は.NET Frameworkのクラス
◦ [System.Management.Automation.Cmdlet]
...
コマンドレット(Cmdlet)の例
25
関数(ファンクション)
 PowerShellではコマンドレットのほか
に関数(ファンクション)を定義できる
 関数には用途に応じた複数の種類
がある
26
関数(ファンクション)の種類
1. 関数(ファンクション)
通常の関数
2. 高度な関数
PowerShell 2.0から利用可能
ファンクションにコマンドレットと同等の属性を付ける
事ができる様になったもの
3. フィルター
パイプラ...
関数(ファンクション)の例
1. 関数
3. フィルター
2. 高度な関数
28
(補足) コマンドレットの命名規則
 コマンドレットには [Verb]-[Noun] な
命名規則が採用されている
◦ 例) Write-Output
 [Verb]については”Get-Verb”コマンドレット
で使用すべき動詞を取得できる...
(補足) コマンドレットの命名規則
 これは “コマンドレット” に対する規則
なので “関数” は従わなくても問題ない
 ただし、従った方が統一感が出て良い
◦ 私見では公開する関数は
[Verb]-[Noun]な名前にするのが良いと考え...
4. PowerShellのパイプライン
31
PowerShellのパイプライン
 PowerShellは他のシェルと違い、
標準出力に相当する出力ストリーム
にはテキストでなくオブジェクトが
出力される
 このため、パイプラインを使う場合は
オブジェクトがパイプされる
32
PowerShellのパイプライン
 オブジェクトパイプライン
 1オブジェクトずつパイプされる
◦ 配列などのコレクションは要素ごとに展開される
◦ 配列の配列は展開されない
 実行例
33
@(1,2,@(3,4),5) | `
% ...
PowerShellのパイプライン
 3つのブロック
◦Begin
最初のオブジェクトがパイプされる直前に呼び出される
◦Process
各オブジェクトがパイプされる毎に呼びされる
◦End
最後のオブジェクトがパイプされた後に呼び出さ...
PowerShellのパイプライン
 動作例
35
> @(1..5) | Command1 | Command2
Command1 Command2
Begin
Process
End
Begin
Process
End
Int[] 配列
...
(比較) bashのパイプライン
 Pipeシステムコールでプロセスは並列実行
 入出力はテキスト(バイナリ)をストリーミング
◦ OS毎に異なるバッファサイズ
36
Process1 Process2
pipe
write read
5. オブジェクトの出力
37
コンソールに文字が出るということ
 PowerShellは他のシェルと違い、
標準出力に相当する出力ストリームには
テキストでなくオブジェクトが出力される
(2回目)
 このため、コンソールに文字を出すため
には何らかの方法で、
オブジェク...
Write(Get) | Format | Out
 PowerShellではストリームに出力された
オブジェクトは原則、
1. Format-*なコマンドレットによって
表示書式が設定され
2. Out-*なコマンドレットによって
コンソー...
Write(Get) | Format | Out
 明示的な実行例
 暗黙的な実行例
40
# Get-ChildItem(ls)の実行例
Get-ChildItem | Format-Wide | Out-Host
# Out-* を明...
Format-*なコマンドレット
名称 表示形式 特記事項
Format-List リスト形式
Format-Table 表形式
Format-Wide 複数列形式
Format-Custom 独自の表示形式 Update-FormatData...
既定のフォーマット Format-Default
 既定の書式指定を行う
 PowerShell内部用でユーザーは利用
できない
 Format-*なコマンドレットを明示しない
場合にOut-*なコマンドレットの内部で
呼び出されている ...
format.ps1xml
 各オブジェクト(型)が既定でどの様な
表示書式を持つかは、 *.format.ps1xml
というXMLファイルに定義されている
 このXMLファイルはpowershell.exeと同じ
ディレクトリに存在
...
Out-*なコマンドレット
名称 出力先 特記事項
Out-Host ホスト(=実行環境) PowerShellコンソール、
PowerShell ISEなど
Out-File ファイル
Out-GridView グリッド形式のウィンドウ Fo...
既定の出力 Out-Default
 既定の出力先
 出力先は基本的にホストとなる
(≒Out-Hostと考えてよい)
 Out-*を明示しない場合、
PowerShell内部で自動的にパイプライン
の最後に Out-Default が追...
まとめ
1. PowerShellは.NET Frameworkの型をベース
としたオブジェクトを扱う
2. PowerShellでは標準入出力に相当するもの
はストリームと呼ばれ、オブジェクトを入出力
する
3. PowerShellのコマン...
参考資料
 Windows PowerShell Language Specification Version 3.0
◦ https://www.microsoft.com/en-us/download/details.aspx?id=36...
48
ご清聴ありがとうございました
Próxima SlideShare
Cargando en…5
×

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

22.295 visualizaciones

Publicado el

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

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

Publicado en: Tecnología
  • Sé el primero en comentar

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

  1. 1. ”オブジェクト”から学ぶ PowerShell 2016/04/23 CLR/H #99 ~サクラサク~ 素敵なおひげ
  2. 2. 自己紹介  素敵なおひげ ◦Twitter - @stknohg ◦Blog - http://stknohg.hatenablog.jp/  何者? ◦CLR/HとJAZUG札幌(きたあず)の裏方です。 ◦札幌市内のSI屋さんで働いてます。 ◦PowerShell絶賛勉強中! 2
  3. 3. はじめに PowerShellは”オブジェクト“を扱う シェルです。 今日はこの”オブジェクト“を通して PowerShellの基本的な仕組みを 学びます。 3
  4. 4. アジェンダ 1.PowerShellのオブジェクト 2.ストリームと標準入出力 3.コマンドレット 4.PowerShellのパイプライン 5.オブジェクトの出力 4
  5. 5. 本セッションでやらないこと PowerShellの文法に関すること ◦細かい文法には触れません スクリプトの書き方に関すること ◦コーディングはしません コマンドの機能説明 ◦個別の機能説明はしません 5
  6. 6. 1. PowerShellのオブジェクト 6
  7. 7. 他シェルとの比較  PowerShellはオブジェクトを扱うシェル  簡単なスクリプトで、 ◦コマンドプロンプト(cmd.exe) ◦Bash ◦PowerShell の三者の違いを比較する 7
  8. 8. コマンドプロンプト(cmd.exe)  実行結果 8 > SET Now=%DATE% > echo %Now%
  9. 9. コマンドプロンプト(cmd.exe) 1. %DATE%環境変数に設定されている 文字列の日付を%Now%変数に代入 2. echoコマンドで%Now%変数の内容を 標準出力に出力 3. 出力結果がそのままコンソールに 表示される 9
  10. 10. Bash  実行結果 10 # Now=`date` # echo $Now
  11. 11. Bash 1. dateコマンドを実行し、結果の文字列 を変数$Nowに代入 2. echoコマンドで$Now変数の内容を 標準出力に出力 3. 出力結果がそのままコンソールに 表示される 11
  12. 12. PowerShell  実行結果 12 > $Now = Get-Date > Write-Output $Now
  13. 13. PowerShell 1. Get-Dateコマンドレットを実行し、 System.DateTime型の結果を$Now変数 に代入 2. Write-Outputコマンドレットで$Now変数 の内容を出力ストリームに出力 3. 出力結果が文字列としてコンソールに 表示される 13
  14. 14. PowerShell  オブジェクトなのでメソッドも呼べる  また、従来のSystem.DateTime型には無い プロパティを持っていたりする 14 # AddDaysメソッドを呼び出して翌日の日付を取得 $Tomorrow = $Now.AddDays(1) Write-Output $Tomorrow # 本来System.DateTime型のオブジェクトには無い # DisplayHintプロパティを使用することができる Write-Output $Now.DisplayHint
  15. 15. PowerShellのオブジェクト  PowerShellでは.NET Frameworkの型を もつオブジェクトを扱う  純粋な.NET Frameworkのオブジェクトとは 異なり独自のプロパティを拡張可能(ETS)  そして、.NET Frameworkをベースにして ◦ WMI ◦ COM ◦ ADSI ◦ ADO.NET ◦ XML など のオブジェクトを統一的に扱える(ATS) 15 ※本セッションではETS/ATSの詳細には触れません
  16. 16. PowerShellのオブジェクト PSObject ◦ [System.Management.Automation.PSObject] ◦ PowerShellで扱うオブジェクトの実体 ◦ [System.Object]の様な基底クラスではない 実際のオブジェクトインスタンスを内包する 委譲モデル  PSObjectは PowerShellの利用者には隠蔽されている 16 ※PowerShellの深淵を見ることになるので、 PSObjectの詳細には触れません!
  17. 17. 2. ストリームと標準入出力 17
  18. 18. ストリームと標準入出力  PowerShellのストリーム ◦ PowerShellではオブジェクトを入出力するため、 他のシェルとは異なり標準入出力に相当する 部分はストリームと呼ばれる  ストリームと標準入出力 ◦ ストリームと標準入出力は似ているが別物 ◦ PowerShellと外部のExeが連携する場合、 ストリーム(オブジェクト) ⇔ 標準入出力(テキスト) の変換が発生する 18
  19. 19. 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
  20. 20. ストリーム標準入出力  PowerShell → 外部Exe ◦ コンソールに表示される文字列を 標準入力へ渡す ◦ $OutputEncoding で設定されている エンコーディング(デフォルト ASCII)でエンコード ◦ 最後に必ず改行(CRLF)が付く  外部Exe → PowerShell ◦ 標準出力を文字列([stirng[]]型)に変換 ◦ [Console]::OutputEncoding で設定されている エンコーディング(デフォルト MS932)でエンコード ◦ バイナリ出力も文字列化される 20
  21. 21. 全体像 21 http://stknohg.hatenablog.jp/entry/2015/06/26/001944 より
  22. 22. 3. コマンドレット 22
  23. 23. PowerShellのコマンド  PowerShellは他のシェルと違い、 コマンドによる入出力はテキスト ではなくオブジェクトになる  このため、PowerShellには オブジェクトを入出力する独自の コマンド体系(コマンドレット) が存在する 23
  24. 24. コマンドレット(Cmdlet)とは  簡単に言うとPowerShellの内部コマンド ◦ 組み込み済み+自作可能  実体は.NET Frameworkのクラス ◦ [System.Management.Automation.Cmdlet] クラスを継承したもの  格納単位はスナップインまたはモジュール (Dll or psm1) ◦ ただし、スナップインはもうほとんど使われない ◦ モジュールだけ覚えておけば良い 24
  25. 25. コマンドレット(Cmdlet)の例 25
  26. 26. 関数(ファンクション)  PowerShellではコマンドレットのほか に関数(ファンクション)を定義できる  関数には用途に応じた複数の種類 がある 26
  27. 27. 関数(ファンクション)の種類 1. 関数(ファンクション) 通常の関数 2. 高度な関数 PowerShell 2.0から利用可能 ファンクションにコマンドレットと同等の属性を付ける 事ができる様になったもの 3. フィルター パイプラインでパイプすることを前提とした簡易的な関数 4. ワークフロー PowerShell 3.0から利用可能 ワークフロー用の特殊な関数 27 ※本セッションではワークフローには触れません
  28. 28. 関数(ファンクション)の例 1. 関数 3. フィルター 2. 高度な関数 28
  29. 29. (補足) コマンドレットの命名規則  コマンドレットには [Verb]-[Noun] な 命名規則が採用されている ◦ 例) Write-Output  [Verb]については”Get-Verb”コマンドレット で使用すべき動詞を取得できる ◦ 使用すべきでない動詞を使ったモジュールを 公開すると警告が出る  [Noun]については自由 29
  30. 30. (補足) コマンドレットの命名規則  これは “コマンドレット” に対する規則 なので “関数” は従わなくても問題ない  ただし、従った方が統一感が出て良い ◦ 私見では公開する関数は [Verb]-[Noun]な名前にするのが良いと考える 30
  31. 31. 4. PowerShellのパイプライン 31
  32. 32. PowerShellのパイプライン  PowerShellは他のシェルと違い、 標準出力に相当する出力ストリーム にはテキストでなくオブジェクトが 出力される  このため、パイプラインを使う場合は オブジェクトがパイプされる 32
  33. 33. PowerShellのパイプライン  オブジェクトパイプライン  1オブジェクトずつパイプされる ◦ 配列などのコレクションは要素ごとに展開される ◦ 配列の配列は展開されない  実行例 33 @(1,2,@(3,4),5) | ` % { Write-Host “$($_.GetType())型の値 $($_) がパイプされました…”}
  34. 34. PowerShellのパイプライン  3つのブロック ◦Begin 最初のオブジェクトがパイプされる直前に呼び出される ◦Process 各オブジェクトがパイプされる毎に呼びされる ◦End 最後のオブジェクトがパイプされた後に呼び出される 34
  35. 35. 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
  36. 36. (比較) bashのパイプライン  Pipeシステムコールでプロセスは並列実行  入出力はテキスト(バイナリ)をストリーミング ◦ OS毎に異なるバッファサイズ 36 Process1 Process2 pipe write read
  37. 37. 5. オブジェクトの出力 37
  38. 38. コンソールに文字が出るということ  PowerShellは他のシェルと違い、 標準出力に相当する出力ストリームには テキストでなくオブジェクトが出力される (2回目)  このため、コンソールに文字を出すため には何らかの方法で、 オブジェクト ⇒ 文字列への変換 を行う必要がある 38
  39. 39. Write(Get) | Format | Out  PowerShellではストリームに出力された オブジェクトは原則、 1. Format-*なコマンドレットによって 表示書式が設定され 2. Out-*なコマンドレットによって コンソールやファイル等へ文字列の 最終出力が行われる  これらのコマンドレットは明示的または 暗黙的にパイプラインでパイプされる 39
  40. 40. Write(Get) | Format | Out  明示的な実行例  暗黙的な実行例 40 # Get-ChildItem(ls)の実行例 Get-ChildItem | Format-Wide | Out-Host # Out-* を明示しない場合 Get-ChildItem | Format-Wide # Format-* Out-* を明示しない場合 Get-ChildItem
  41. 41. Format-*なコマンドレット 名称 表示形式 特記事項 Format-List リスト形式 Format-Table 表形式 Format-Wide 複数列形式 Format-Custom 独自の表示形式 Update-FormatDataで 書式を設定 Format-Defualt 既定の フォーマット PowerShell内部用 Format-*を明示しない場合 に内部的に使用される 41
  42. 42. 既定のフォーマット Format-Default  既定の書式指定を行う  PowerShell内部用でユーザーは利用 できない  Format-*なコマンドレットを明示しない 場合にOut-*なコマンドレットの内部で 呼び出されている ※一部例外あり 42
  43. 43. format.ps1xml  各オブジェクト(型)が既定でどの様な 表示書式を持つかは、 *.format.ps1xml というXMLファイルに定義されている  このXMLファイルはpowershell.exeと同じ ディレクトリに存在  このXMLファイルは編集不可 ◦ 署名付きXML 43 ※本セッションでは詳細には触れません
  44. 44. 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
  45. 45. 既定の出力 Out-Default  既定の出力先  出力先は基本的にホストとなる (≒Out-Hostと考えてよい)  Out-*を明示しない場合、 PowerShell内部で自動的にパイプライン の最後に Out-Default が追加される 45 Get-ChildItem # ↓ PowerShell内部で(| Out-Default)を追加 Get-ChildItem | Out-Default
  46. 46. まとめ 1. PowerShellは.NET Frameworkの型をベース としたオブジェクトを扱う 2. PowerShellでは標準入出力に相当するもの はストリームと呼ばれ、オブジェクトを入出力 する 3. PowerShellのコマンドと関数はオブジェクトを 扱う 4. PowerShellのパイプラインはオブジェクトを パイプする 5. PowerShellのオブジェクトはFormat-*なコマン ドレットにより書式指定され、Out-*なコマンド レットで文字列として最終出力される 46
  47. 47. 参考資料  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
  48. 48. 48 ご清聴ありがとうございました

×