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

C#erがPowerShellを使い始めてみた

 C#erがPowerShellを使い始めてみた

PowerShellを使い始めて学んだ基本的な書き方やCmdletの定義方法をまとめました。

a_taihei

July 13, 2014
Tweet

Other Decks in Programming

Transcript

  1. 今回話すこと • PowerShellの超基本的な書き方, 使い方 • 基本構文 • Cmdlet • Module

    • パイプラインについて • C#を使った書き方にはほとんど触れません • C#とほぼ同等なところは割愛したりします
  2. 何故PowerShellを使い始めたのか • cmd書きたくない • パラメータ覚えるのシンドイ • / なの? - なの?

    要らないの? • 補完無いのツライ • .NET の資産がフルに使える • .NET 便利 • Windows に標準でインストール • インストールめんどくさい
  3. PowerShell ISE • Windows PowerShell Integrated Scripting Environment • 統合スクリプティング環境

    • 要するにPowerShell用の統合開発環境 • 英語圏の方は “アイス” と発音するらしい • 利点 • IntelliSenseが効く • デバッグが出来る • 利用可能なCmdletの一覧が見える • コードスニペットが使える • 作れる • スクリプトウインドウで Ctrl + X, C, Vなどが効く
  4. PowerShell ISE - 基本操作 • 新規作成 • Ctrl + N

    • 保存 • Ctrl + S • 実行 • F5 • 選択範囲を実行 • F8 • ステップオーバー • F10 • ステップイン • F11 • コードスニペットの挿入 • Ctrl + J • など チートシートやリファレンスが公開されています http://www.powershellmagazine.com/2014/04/24/windows-powershell-4-0-and-other-quick-reference-guides/
  5. PowerShell ISE – コマンドレットの検索 • 部分一致で検索 • あいまい検索は不可 • 引数の確認

    • 引数の型の確認 • Parameter Setの確認 • C#で言うオーバーロード • 戻り値の型の確認 • ただしヘルプを開かないと確認 できない • Get-Help Name –ShowWindow と 同じ
  6. PowerShell ISE – コードスニペットの作成 New-IseSnippet ` -Title "タイトル" ` -Description

    "詳細説明" ` -Text "スニペット" ` -Author "著者" ` -CaretOffset オフセット(数値) ` -Force
  7. PowerShell ISE – コードスニペットの作成 <# スニペット作成のスニペットを作成 #> New-IseSnippet ` -Title

    "IseSnippet" ` -Description “スニペットのスニペット" ` -Text @" New-IseSnippet -Text @" "`@ `` -Title "" `` -Author "" `` -CaretOffset `` -Forse "@ ` -Author "a_taihei" ` -CaretOffset 28 ` # Textの始まりにオフセットをあわせる -Force
  8. 基本 – 文字列 / 数値 • 文字列 • “string” または

    ‘string’ • ※ ダブルクオートとシングルクオートで動作が異なる • ヒアドキュメント • @” 文字列 ”@ • 文字列は2行目以降、”@はインデント無しの先頭に配置する必要がある • ※ こちらもダブルクオートとシングルクオートで動作が異なる • 数値 • C#と同様
  9. 基本 – 変数 • 変数宣言は不要 いつでも使用可 • 通常 • 先頭文字が「$」

    • 2文字目以降が「英数字+アンダースコア」 • 特殊1(スペースや記号を含む変数名) • ${ver¥with symbol} • 特殊2(コンテンツ参照) • ${FileFullPath} • 型付変数 • [Type]$var
  10. 基本 – 特殊な変数 • $true, $false • Booleanを表す特殊変数 • $null

    • null を表す特殊変数 • $^, $$ • 直前に実行された処理の最初, 最後のトークンを返却 • $? • 最後に実行された処理の成否をBooleanで返却 • $_ • パイプラインを通して渡されたオブジェクトを返却
  11. 基本 – 文字列内で変数を展開 • ダブルクオートで囲まれた文字列の場合 内部で変数の展開が可能 • “abc $var def”

    • プロパティを呼び出したい場合は$()で囲む必要がある • “abc$($var.Name)def” • $() には複数行の式も記述可能 • ダブルクオートのヒアドキュメントも同様 • シングルクオートの場合は展開されず$が文字として格納
  12. 基本 – 配列 • 宣言 • @() • 要素数0の配列 •

    @(value1, value2, value3) • value1, value2, value3 • ,value1 • 要素数1の配列
  13. 基本 – 範囲 • 範囲配列の取得 • $start .. $end で

    $start から $end まで連番の配列を取得
  14. 1 .. 6 基本 – 範囲 • 範囲配列の取得 • $start

    .. $end で $start から $end まで連番の配列を取得
  15. 基本 – 範囲 • 範囲配列の取得 • $start .. $end で

    $start から $end まで連番の配列を取得 1 2 3 4 5 6
  16. 基本 – スライス • スライス • $Array[$start .. $end] で

    $start から $end までの配列を取得 A B C D E F 0 1 2 3 4 5 [1 .. 3]
  17. 基本 – スライス • スライス • $Array[$start .. $end] で

    $start から $end までの配列を取得 A B C D E F 0 1 2 3 4 5
  18. 基本 – ハッシュテーブル • 宣言 • @{} • 要素数0のハッシュテーブル •

    @{ Key1 = “Value1”; Key2 = “Value2”; } • [Ordered]@{} • OrderedDictionary • [PSCustomObject]@{Key1 = “Value1”; Key2 = “Value2”} • PSCustomObject • 参照 • $hash[“Key1”] • $hash.Key1 • Keyをプロパティの様に参照可能
  19. 基本 – 算術演算子 • C#とほぼ同等の文法 • “文字列” * 正の数 •

    数値の回数分文字列が繰り返される • 例:”abc” * 3 # => “abcabcabc” • “数字” * 数値 • 暗黙の型変換が行われ、通常の乗算が実施される • “文字列” + その他オブジェクト • 暗黙の型変換が行われ、文字列+ToString()の結果となる • 例:”abc” + 1 # => “abc1”
  20. 基本 – 比較 • 基本 • $var1 –keyword $var2 •

    = (Equal) • -eq, -ieq, -ceq • iが付く場合はIgnore Case • cが付く場合はNot Ignore Case • != (Not Equal) • -ne, -ine, -cne • > (Greater than) • -gt, -igt, -cgt • < (Less Than) • -lt, -ilt, -clt • >= (Greater Equal) • -ge, -ige, cge • >= (Less Equal) • -le, -ile, cle • 正規表現 • -match, -imatch, -cmatch • 正規表現 (不一致) • -notmatch, inotmatch, cnotmatch • あいまい • -like, -ilike, -clike • あいまい (不一致) • -notlike, -inotlike, -cnotlike
  21. 基本 – 条件分岐 • if式 • if (条件1) { <#

    ステートメント #> } elseif (条件2) { <# ステートメント #> } • switch式 • switch (値) { ‘value1’ { <# ステートメント #> } {$_ -in ‘value2’, ‘value3’, ‘value4’} {<# ステートメント #> } default {<# ステートメント #> } }
  22. 基本 – 条件分岐 • if式 • if (条件1) { <#

    ステートメント #> } elseif (条件2) { <# ステートメント #> } • switch式 • switch (値) { ‘value1’ { <# ステートメント #> } {$_ -in ‘value2’, ‘value3’, ‘value4’} {<# ステートメント #> } default {<# ステートメント #> } } PowerShellの条件分岐では 最後に評価された結果が戻り値とし て返却される
  23. 基本 – 条件分岐 $if = if ($true) { 1 }

    else { 2 } $switch = switch (2) { 1 { "a" } 2 { "b" } } $if => 1 $switch => “b”
  24. 基本 – スクリプトブロック • C#でいうところの匿名関数 • 構文 • { <#

    ステートメント #> } • 引数は一つだけ $_ で参照 • Where-Object や ForEach-Object などで頻繁に利用 • { param($1, $2..) <# ステートメント #> } • 複数の引数は Invoke-Command で使用 • Invoke-Command –ScriptBlock $block –ArgumentList arg1, arg2 .. • &{ <# ステートメント #> } • 即時実行
  25. 基本 – Cmdlet を実行する • C#で言うところの関数に近い • C#でCmdletを実装するときはCmdletクラスを継承したクラス • 構文

    • Cmdlet –ArgumentName Argument … • ハイフンに続いて引数名を指定 • IntelliSenseが効く • 引数名のあとに引数を指定 • ものによってIntelliSenseが効く
  26. 基本 - .NETの資産を活用する • .NETのClassを指定する • [System.IO.File] のように [] で囲い

    namespace を含めて記述する • PowerShell には using が無い • .NETのClassをインスタンス化する • New-Object コマンドレットを使用する • New-Object ` -TypeName “Namespace.TypeName” ` -ArgumentList arg1, arg2... • static メソッドを使う • [Namespace.TypeName]::StaticMethod(arg1, arg2...) PS C:¥WINDOWS¥system32> using Hoge; 発生場所 行:1 文字:1 + using Hoge; + ~~~~~ このバージョンの言語では、'using' キーワードがサポート されていません。 + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordEx ception + FullyQualifiedErrorId : ReservedKeywordNotAllowed
  27. 基本 - .NETの資産を活用する • 使いたいAssemblyが読み込まれていない • AppDomainのAssemblyLoadを使って読み込む • 2.0まではこのやり方 •

    Add-Type -LiteralPath を使って読み込む • AddType -LiteralPath C:¥Assemblies¥sample.dll • Add-Type -AssemblyName を使って読み込む • Add-Type -AssemblyName AssemblyName • 3.0以降はこちら • Add-Type –AssemblyName System.IO.Compression.FileSystem など非常によく使う
  28. 基本 – .NETの資産を活用する • デフォルトで読み込まれているdllは以下の通り Accessibility.dll, Anonymously Hosted DynamicMethods Assembly.dll,

    MetadataViewProxies_a196976d-d8bc-4879-9b71-53049c9f08d8.dll, Microsoft.Build.Framework.dll, Microsoft.CSharp.dll, Microsoft.GeneratedCode.dll, Microsoft.HyperV.PowerShell.dll, Microsoft.Management.Infrastructure.dll, Microsoft.PowerShell.Commands.Management.dll, Microsoft.PowerShell.Commands.Utility.dll, Microsoft.PowerShell.Commands.Utility.resources.dll, Microsoft.PowerShell.Editor.dll, Microsoft.PowerShell.Editor.resources.dll, Microsoft.PowerShell.GPowerShell.dll, Microsoft.PowerShell.GPowerShell.resources.dll, Microsoft.PowerShell.GraphicalHost.dll, Microsoft.PowerShell.GraphicalHost.resources.dll, Microsoft.PowerShell.ISECommon.dll, Microsoft.PowerShell.ScheduledJob.dll, Microsoft.PowerShell.Security.dll, Microsoft.PowerShell.Security.resources.dll, Microsoft.Windows.DSC.CoreConfProviders.dll, Microsoft.WSMan.Management.dll, Microsoft.WSMan.Management.resources.dll, Microsoft.WSMan.Runtime.dll, mscorlib.dll, mscorlib.resources.dll, powershell_ise.dll, powershell_ise.resources.dll, PresentationCore.dll, PresentationCore.resources.dll, PresentationFramework.dll, PresentationFramework.Aero2.dll, PresentationFramework.resources.dll, PresentationFramework- SystemCore.dll, PresentationFramework-SystemData.dll, PresentationFramework-SystemXml.dll, PSEventHandler.dll, SMDiagnostics.dll, System.dll, System.ComponentModel.Composition.dll, System.ComponentModel.DataAnnotations.dll, System.Configuration.dll, System.Configuration.Install.dll, System.Core.dll, System.Data.dll, System.Data.SqlXml.dll, System.DirectoryServices.dll, System.Drawing.dll, System.Dynamic.dll, System.Management.dll, System.Management.Automation.dll, System.Management.Automation.resources.dll, System.Numerics.dll, System.resources.dll, System.Runtime.Caching.dll, System.Runtime.Serialization.dll, System.Security.dll, System.ServiceModel.dll, System.ServiceModel.Activation.dll, System.ServiceModel.Internals.dl l, System.ServiceProcess.dll, System.Transactions.dll, System.Web.dll, System.Web.ApplicationServices.dll, System.Web.Extensions.dll, System.Web.Services.dll, System.Windows.Forms.dll, System.Windows.Forms.resources.dll, System.Xaml.dll, System.Xml.dll, System.Xml.resources.dll, UIAutomationProvider.dll, UIAutomationTypes.dll, WindowsBase.dll
  29. 基本 – .NETの資産を活用する • デフォルトで読み込まれているdllは以下の通り Accessibility.dll, Anonymously Hosted DynamicMethods Assembly.dll,

    MetadataViewProxies_a196976d-d8bc-4879-9b71-53049c9f08d8.dll, Microsoft.Build.Framework.dll, Microsoft.CSharp.dll, Microsoft.GeneratedCode.dll, Microsoft.HyperV.PowerShell.dll, Microsoft.Management.Infrastructure.dll, Microsoft.PowerShell.Commands.Management.dll, Microsoft.PowerShell.Commands.Utility.dll, Microsoft.PowerShell.Commands.Utility.resources.dll, Microsoft.PowerShell.Editor.dll, Microsoft.PowerShell.Editor.resources.dll, Microsoft.PowerShell.GPowerShell.dll, Microsoft.PowerShell.GPowerShell.resources.dll, Microsoft.PowerShell.GraphicalHost.dll, Microsoft.PowerShell.GraphicalHost.resources.dll, Microsoft.PowerShell.ISECommon.dll, Microsoft.PowerShell.ScheduledJob.dll, Microsoft.PowerShell.Security.dll, Microsoft.PowerShell.Security.resources.dll, Microsoft.Windows.DSC.CoreConfProviders.dll, Microsoft.WSMan.Management.dll, Microsoft.WSMan.Management.resources.dll, Microsoft.WSMan.Runtime.dll, mscorlib.dll, mscorlib.resources.dll, powershell_ise.dll, powershell_ise.resources.dll, PresentationCore.dll, PresentationCore.resources.dll, PresentationFramework.dll, PresentationFramework.Aero2.dll, PresentationFramework.resources.dll, PresentationFramework- SystemCore.dll, PresentationFramework-SystemData.dll, PresentationFramework-SystemXml.dll, PSEventHandler.dll, SMDiagnostics.dll, System.dll, System.ComponentModel.Composition.dll, System.ComponentModel.DataAnnotations.dll, System.Configuration.dll, System.Configuration.Install.dll, System.Core.dll, System.Data.dll, System.Data.SqlXml.dll, System.DirectoryServices.dll, System.Drawing.dll, System.Dynamic.dll, System.Management.dll, System.Management.Automation.dll, System.Management.Automation.resources.dll, System.Numerics.dll, System.resources.dll, System.Runtime.Caching.dll, System.Runtime.Serialization.dll, System.Security.dll, System.ServiceModel.dll, System.ServiceModel.Activation.dll, System.ServiceModel.Internals.dl l, System.ServiceProcess.dll, System.Transactions.dll, System.Web.dll, System.Web.ApplicationServices.dll, System.Web.Extensions.dll, System.Web.Services.dll, System.Windows.Forms.dll, System.Windows.Forms.resources.dll, System.Xaml.dll, System.Xml.dll, System.Xml.resources.dll, UIAutomationProvider.dll, UIAutomationTypes.dll, WindowsBase.dll [System.AppDomain]::CurrentDomain.GetAssemblies() ` | sort -Property FullName ` | select FullName で確認できます
  30. オブジェクトが受け渡されるので 処理はオブジェクト単位で行われる Get-ChildItem であれば Fileオブジェクト (またはDirectoryオブジェクトなど) そのため下記のような記述ができる Get-ChildItem –File |

    %{ Write-Host $_.Name } Pipeline – 例 [System.IO.File] クラスの インスタンスを内包しているので Name プロパティを参照できる 当然IntelliSenseも効く
  31. Cmdlet • PowerShellで書く場合は ”高度な関数” と呼ぶ • PowerShell 2.0から実装可能 • 1.0ではC#でしか実装できなかった

    • 単なるfunctionと異なり様々な制御が加えられる • 例えば • パイプラインからオブジェクトの入力 • 引数の検証 • 引数のオーバーロード • 引数の位置指定 • 等々・・・
  32. Cmdlet – 構造 • コマンドレットの構造 • ヘルプコメント • 関数宣言 •

    CmdletBinding属性の宣言 • OutputType属性の宣言 • 引数の宣言 • Parameterの属性の宣言 • 各Validation属性の宣言 • Alias属性の宣言 • Begin ブロックの記述 • Process ブロックの記述 • End ブロックの記述
  33. Cmdlet – 関数宣言 • Verb-Noun とは? • Cmdletを作成する際の命名規則 • Required

    Development Guidelines にも記載 • Verb • 動詞 • 利用可能なVerbは限定されている • ForEach など一部例外あり • Get-Verb で確認可能 • Noun • 名詞 • わかりやすい名前を付ければ自由 • モジュール名をPrefixとして付与する事が多い
  34. Cmdlet – CmdletBinding属性 • 引数 (param) 宣言の前に記述 • CmdletBindingにはいくつかプロパティがある •

    設定することでCmdletの振る舞いを細かく設定できる • 次のスライドからCmdletBindingの プロパティと役割について解説 • 一部詳しく記載
  35. Cmdlet – SupportsShouldProcess プロパティ • Booleanで有効/無効を設定する • 有効な場合以下のパラメータが利用できるようになる • -WhatIf

    • -Confirm • それぞれのパラメータを指定した場合 • -WhatIf → 実際の処理は実施せずに何が行われるかを出力する • -Confirm → 実際の処理が行われる前に確認する • ことが求められる
  36. Cmdlet – ConfirmImpact プロパティ • “None”, “Low”, “Medium”, “High” のいずれかから選択する

    • High • システムに変更を加える場合に設定 • Medium • ファイルを作成する程度の操作の場合に設定 • Low • 極小さな変更が生じる程度の操作の場合に設定 • くらいの感覚。厳密な基準は無い。 • SupportsShouldProcess プロパティと一緒に設定・利用する
  37. Cmdlet – ShouldProcess • ShouldProcessとは • $PSCmdletを介して利用できるメソッド • 引数は ([string]$Target)

    OR ([string]$Target, [string]$Operation) • 他にもオーバーロードはあるが割愛 • ConfirmImpact プロパティに設定された値が$ConfirmPreferenceに 設定されている値と同じかそれ以上の場合、確認メッセージが表示さ れる • -Confirm パラメータが指定された場合 強制的に確認メッセージが表示される
  38. Cmdlet – ShouldProcess • -WhatIf パラメータを指定した場合 ShouldProcess を呼んだ箇所で以下のフォーマットで メッセージが出力され、メソッドの戻り値が必ずFalseとなる WhatIf:

    対象 “$Target” に対して操作 “Cmdlet名" を実行しています。 WhatIf: 対象 “$Target" に対して操作 “$Operation" を実行しています。 ([string]$Target, [string]$Operation) ([string]$Target)
  39. Cmdlet – CmdletBinding属性 • その他プロパティ • DefaultParameterSetName • Parameter属性で指定可能なParameterSetName (C#でいうオーバーロードのようなもの)が複数種ある場合

    デフォルトではどのParameterSetNameを利用するかを指定 • PositionalBinding • 引数の位置によるバインドが可能かどうかをBooleanで指定 • 呼び出し時に引数名が省略可能となる • SupportsPaging • ページング処理(範囲指定処理)を統一するためのプロパティ • 開始位置(-Skip)の指定、取得する件数(-First)の指定 総件数を含めるか(-IncludeTotalCount)の指定 ができるようになる • 他にもいくつかあります
  40. Cmdlet – 引数 (param) • 構文は以下の通り • param( [Attributes()] [type]$variable1,

    [Attributes()] [type]$variable2...) • オーバーロードを作成可能 • ただし記述がC#とかなり異なる(後述)
  41. Cmdlet – Parameter属性 • Parameter属性のプロパティ • Mandatory • 必須項目かを指定 function

    Test-Mandatory { [CmdletBinding()] param( [Parameter(Mandatory=$true)] [string]$Mandatory ) process { <# #> } } Test-Mandatory -Mandatory “mandatory” #=> OK Test-Mandatory #=> ERROR
  42. Cmdlet – Parameter属性 • Parameter属性のプロパティ • ParameterSetName • C#でいうオーバーロードのセットを指定 function

    Test-ParameterSetName { [CmdletBinding()] param( [Parameter(ParameterSetName =“Normal”)] [string]$Normal1, [Parameter(ParameterSetName =“Normal”)] [string]$Normal2, [Parameter(ParameterSetName =“Reverse”)] [string]$Reverse1, [Parameter(ParameterSetName =“Reverse”)] [string]$Reverse2 ) process { switch ($PSCmdlet.ParameterSetName) { “Normal” { $Normal1 + $Normal2 } “Reverse” { $Reverse2 + $Reverse1 } } } } Test-ParameterSetName -Normal1 “1” -Normal2 “2” #=> 12 Test-ParameterSetName -Reverse1 “1” -Reverse2 “2” #=> 21 Test-ParameterSetName -Normal1 “1” -Reverse2 “2” #=> ERROR 異なるParameterSetNameの引数を 同時に扱うことはできない
  43. Cmdlet – Parameter属性 • Parameter属性のプロパティ • Position • 引数の順序を指定 •

    CmdletBinding.PositionalBinding が有効で 呼び出し時に引数名を省略した場合、この順序に合わせて引数が割り当てられる • ValueFromPipeline • パイプラインから値をセットすることができる引数かを指定 • ValueFromPipelineByPropertyName • パイプラインから渡されたオブジェクトが引数名と一致したプロパティ名を 持っている場合に値がセットされるかを指定 • ValueFromRemainingArguments • 割り当てられていない引数を格納できる引数かを指定 • これが指定された引数を明示的に指定した場合は余剰引数が割り当てられず エラーとなる
  44. Cmdlet – Validation系属性 • ValidateCount(int minLength, int maxLength) • 引数の数を制限する

    • ValidateLength(int minLength, int maxLength) • 引数の文字列の長さを制限する • 文字列の配列([string[]])にも有効 • ValidatePattern(string regexString, [Option]RegexOptions) • 正規表現で検証内容を指定 • ValidateRange(object minRange, object maxRange) • 引数の範囲を制限する • 左右の型は同じである必要がある • VaidateSet(params string[] values, [Option]IgnoreCase) • 特定の文字列のみに制限する • 他、AllowNull, AllowEmptyStringなど多数
  45. Cmdlet – Process ブロック • パイプライン経由で実行された場合 レコードごとに実行されるブロック • process {

    <# ステートメント #> } • return した値、または最後に評価された値が次のCmdletにパイプライン経由で渡される • throw を使用することでエラー処理が行われる • これはパイプラインの後続処理が継続されることに注意 • $PSCmdlet.ThrowTerminatingError メソッドを利用することでエラー処理が行われる • これはパイプラインの後続処理が実施されない