Save 37% off PRO during our Black Friday Sale! »

Introduction of Windows PowerShell

C61c4df7cb3f2da2b4a7e7fe08bca7e1?s=47 guitarrapc
December 21, 2013

Introduction of Windows PowerShell

PowerShell 初心者の方に向けてPowerShellのこれまでと使いどころをお伝えします。
PowerShellの歴史と目的
基本的な文法(ifやforeachなど)
cmdやvbs、シェルスクリプトとの違いから見る使いどころ

C61c4df7cb3f2da2b4a7e7fe08bca7e1?s=128

guitarrapc

December 21, 2013
Tweet

Transcript

  1. None
  2. @Job PowerShell @個人活動 http://tech.guitarrapc.com @guitarrapc_tech https://github.com/guitarrapc/valentia

  3. None
  4. None
  5. None
  6. None
  7. None
  8. Cmdlet/Function/Snap-in Remoting/Module/Job/ISE Intellisense/Workflow DSC/MethodSyntax 2006 PS 1.0 2008 PS 2.0

    2012 PS 3.0 2013 PS 4.0 Monad Automation Model Monad Shell Monad Remote Scripting Monad Management Console Monad Management Model
  9. command.com DOS/9x NT/2000 cmd 98 vbs XP/2003 8.1 Vista 7

  10. command.com DOS/9x NT/2000 cmd 98 8.1 PowerShell 2008 PS 2.0

    2012 PS 3.0 2013 PS 4.0 XP/2003 Vista 2006 PS 1.0 vbs 7 Remoting/Module/Job/ISE Intellisense/Workflow DSC/MethodSyntax
  11. http://exploringdata.github.com/vis/programming-languages-influence-network/

  12. None
  13. 1. 「テキストベースでの処理が必須」 2. 「cmdやコマンド自体の拡張は難しく」 「それぞれのコマンドの習熟」

  14. すべてオブジェクトとして扱う # d:¥hoge.txt # hogehoge # ファイルを読み込む => 文字列は System.String型

    (Get-Content d:¥hoge.txt).GetType().FullName # System.String
  15. 自分で書くことも 呼び出すことも 組み込み新しいコマンドを作ることも すべて可能 # ディレクトリだけを取得する新しいファンクションを定義 function New-GetDirectory { Get-ChildItem

    | Where PSIsContainer -EQ $true }
  16. ヘルプ を出力させることができる。 # PowerShell では -? は必ず help を出力 Get-Command

    -? # cmd.exe でヘルプは /? や /help や /h と不定で困った… cmd -?
  17. None
  18. None
  19. インストール不要で利用できるという意味 PowerShell V2 : Windows 7, Windows Server 2008R2 PowerShell

    V3 : Windows 8, Windows Server 2012 PowerShell V4 : Windows 8.1, Windows Server 2012 R2 New!!
  20. 話題なところでは…… Windows Azure Office 365 Exchange 従来のcmd や外部コマンドが PowerShellに…… Active

    Directory SQL Server Hyper-V Windows Features WMI *
  21. None
  22. AWS Tools for Windows PowerShell Vmware vSphere PowerCLI XenServer SDK

    for PowerShell Cisco PowerTool pack for PowerShell (CIM の利用)** * Windows Management Instrumentation = CIMのMicrosoft実装 = PS V2までで PS V3からはCIMに移行 ** Common Information Model = DMTGやWBEMに基づいて標準化しており、IT管理対象基盤のオブジェクト表現 を可能にする
  23. None
  24. None
  25. PowerShell には2つの実行環境が標準で存在 1. PowerShell.exe (PowerShell ホスト) 2. PowerShell_ISE.exe (統合スクリプティング環境) 通常

    PowerShell スクリプトやコマンドが実行されるのはPowerShell.exe 他に cmd.exe から PowerShell と入力することで、PowerShellホストが起動。 ※ オプションで簡易編集モードを有効にしないと文字列選択ができない。 ※ cmd上からのPowerShell実行は他にもバグがあったり….. ※ 大量のホスト表示でバッファーが足りず途中で停止するバグも
  26. PowerShell_ISE.exe (PowerShell 標準のスクリプト開発環境) メリット - インテリセンスが効く - デバッグ実行 - スニペットが利用可能

    - コマンド確認が容易 - Windows 標準で入っている 未実装 変数に格納された値の確認 ウォッチビュー ソリューションエクスプローラー
  27. # コマンド一覧を取得 Get-Command

  28. コマンドは Verb-Noun (動詞-名詞) 形式に統一 他のスクリプト言語にない異端な形式 コマンドを知らずとも用途が推測可能 「どうする-何を」 と目的ベースになっているため規則性がある # Get

    = 取得; Command = 実行可能なコマンド; # つまり、「実行可能なコマンドを取得する」と予測が容易 Get-Command
  29. PowerShell で規定しているのは動詞、名詞は自由に設定可能 ※ 命名規則を無視して作ることも可能 # 規定されている動詞一覧を取得 Get-Verb | select Verb|

    Format-Wide -Column 9 # Add Clear Close Copy Enter Exit Find Format Get # Hide Join Lock Move New Open Optimize Pop Push # Redo Remove Rename Reset Resize Search Select Set Show # Skip Split Step Switch Undo Unlock Watch Backup Checkpoint # Compare Compress Convert ConvertFrom ConvertTo Dismount Edit Expand Export # Group Import Initialize Limit Merge Mount Out Publish Restore # Save Sync Unpublish Update Approve Assert Complete Confirm Deny # Disable Enable Install Invoke Register Request Restart Resume Start # Stop Submit Suspend Uninstall Unregister Wait Debug Measure Ping # Repair Resolve Test Trace Connect Disconnect Read Receive Send # Write Block Grant Protect Revoke Unblock Unprotect Use
  30. None
  31. コンソール画面に文字列を表示 # #が頭にくるとコメントアウト <# 間に囲むとマルチラインコメント #> # "" でくくることで文字列として扱われる "Hello

    World!“ # コマンドレットを利用すると Write-Output "Hello World!" # ホスト画面に直接表示 (変数に格納できない) Write-Host "Hello World!" # ホスト画面に直接表示 (変数に格納できない) - .NET Framework の利用 [Console]::WriteLine("Hello World!")
  32. 事前に変数宣言をせずに使用可能 かつ、暗黙的に型変換される # int型で格納される $i = 1 # string型で格納される $s

    = "string" # object[] 配列で格納される $array = "hoge","fuga" # string[] 配列で格納される [string[]]$array = “hoge”,“fuga” # string[] 配列に明示的に型変換している # string[] 配列で格納される [string[]]$stringArray = @() # string[]配列の宣言 [string[]]$stringArray += "hoge“ [string[]]$stringArray += "fuga"
  33. [String]に格納した変数が、int型で足し算されたり逆だったり 基本的には、左辺の型に変換される # string で格納 $s = "1" $s +

    "hoge" # 1hoge (string のまま) 1 + $s # 2 (左辺の1がintなため、[int]に暗黙的に変換)
  34. Cmdlet バイナリ形式で提供される コマンド Function スクリプト形式で記述したコマンド # コマンドをタイプごとにグループ Get-Command | group

    CommandType # Count Name Group # ----- ---- ----- # 7 Alias {Add-ProvisionedAppxPackage, Apply-WindowsUnattend, Flush-Volume, Get-ProvisionedAppxPackage...} # 608 Function {A:, Add-BCDataCacheExtension, Add-DnsClientNrptRule, Add-DtcClusterTMMapping...} # 1361 Cmdlet {Add-AppxPackage, Add-AppxProvisionedPackage, Add-ASACommunicationToCase, Add-BitsFile...}
  35. コマンドレットやファンクションは、.NET Frameworkオブジェクトを 含む配列を返す場合が多い。(Getとか) パイプライン (|)を 渡して、続くコマンドレットに実行結果を渡せる # コマンドをタイプごとにグループ # これは

    Get-Commandの実行結果をGroup-Object コマンドレットに渡している Get-Command | group CommandType # Count Name Group # ----- ---- ----- # 7 Alias {Add-ProvisionedAppxPackage, Apply-WindowsUnattend, Flush-Volume, Get-ProvisionedAppxPackage...} # 608 Function {A:, Add-BCDataCacheExtension, Add-DnsClientNrptRule, Add-DtcClusterTMMapping...} # 1361 Cmdlet {Add-AppxPackage, Add-AppxProvisionedPackage, Add-ASACommunicationToCase, Add-BitsFile...}
  36. 変数は、スコープで参照範囲を制限できる。 スコープは利用範囲で制限することで、 意図しない変数の変更などバグを避けることが可能 (指定しないとlocal) function test-hoge { $private:private = "private"

    # 現在のスコープ(ファンクション内部)外で参照できない $local:local = "local" # 現在のスコープか子ブロックから参照可能 $script:script = "script" # 現在のスクリプト外では参照できないが # スクリプト内であればファンクション外でも参照できる $Global:global = "global" # どのスコープからも読み書き可能 } test-hoge $private # 変数は空 $local # 変数は空 $script # "script" が格納されている(同一スクリプトファイル内なので参照可能) $global # "global" が格納されている
  37. 文字列(string) の操作はメソッドで行える $test = "test" $hogehoge = "hogehoge" $array =

    @("a","b","c") # 結合 $test + $hogehoge # testhogehoge -Join $test,$hogehoge # testhogehoge [string]::Join($test,$hogehoge) # testhogehoge [string]::Join(“,”,$array) #,区切りで a,b,c が出力 # 分割 $array -split "," # a と b と cに分割 $array.split(",") # a と b と cに分割 #長さ $test.Length # 4 #カウント $array.Count # 3
  38. 負の遺産 (状況に応じて List<T>がおすすめ) # 6個の、要素を持つ配列object[] $array = @(1,2,3,4,5,6) # 型指定([T[]]

    で型の配列を示す) [int[]]$intArray = @(1,2,3,4,5,6) # 連番生成(1-10 が生成) 1..10 # 連番を配列に代入 $seq = (1..10) # 最初の要素を参照 $seq[0] # 1 # 配列の要素数 $seq.Length # 10
  39. 負の遺産2 (状況に応じてDictionary<Tkey, TValue> がおすすめ) # KV $a = @{hoge =

    "fuga"} $a.hoge #fuga # 追加 $a.add("foo","bar") # 削除 $a.Remove("hoge") # 確認 $a.Contains("foo") #true
  40. # d:¥hoge.txt # { # "column2": 111, # "column1": "hogehoge"

    # } # Jsonファイルを読み込みオブジェクト処理が可能 Get-Content d:¥hoge.txt -Raw | ConvertFrom-Json # 入力結果 #column2 column1 #------- ------- # 111 hogehoge
  41. if (Test-Path D:¥) { "ルートに存在します" } elseif (Test-Path D:¥hoge) {

    "hogeに存在します" } else { "存在しません" }
  42. foreach ($i in Get-Command) { $i.Name + "_hoge" }

  43. 1 -eq 1 # true (equal) 1 -ne 0 #

    true (not equal) 1 -gt 0 # true (greater than) 1 -ge 1 # true (greater than equal) 1 -lt 2 # true (less than) 1 -le 1 # true (less than equal)
  44. http://winscript.jp/powershell/202

  45. None
  46. インテリセンスが効く cmd の for 文は 変態 for /f hogehoge ……..

    はない。 日付出せますか?
  47. バッチファイルに書いた処理を使いまわせますか? cmdのコマンドごとのパラメータを言えますか? いちいち調べて、実行して試しては、ない。 ADに代表されるコマンドのPowerShell 以降

  48. スクリプトを書いて処理を自動化したい時 Sample : 結果テキスト解析なんていう無駄な手間をする必要がない Get-Process powershell | Stop-Process -Force

  49. リモートPC 処理 1対多で対象サーバーへの デプロイ クレデンシャル処理 自動化

  50. 処理を連携 リモートPCへの自動化 コマンド実行だけ!ならcmdもまぁはい、ありです実際。 だがpsexec お前はダメだ、産廃直行。

  51. None
  52. vbs でできることは PowerShell でより簡潔な記述で可能 vbsはオワコン 新しいプロダクトはPowerShell に標準対応

  53. vbs を頻繁に使ってきた管理ほどPowerShellへ UACを出さずに実行なら、という場合は、はい、確かにvbsを使えばできますね。 でもその前にUACの意義を考えてほしいです。なぜvbsがダメといわれてPowerShellに 移行したのかを。

  54. None
  55. ls, ps あります # bash などで psからgrepでフィルタ ps | grep

    [p]owershell # PowerShell (Where-Object でフィルタ) ps | where Name -EQ powershell # PowerShell (パラメータでフィルタ) ps -Name powershell
  56. パイプライン大好き # 1,Tony Passaquale,7920,20090222 21:59:00,800,4.78,3824,Follow-up # 2,Nigel Shan Shanford,30316,20090405 16:34:00,400,9.99,3996,New-Opportunity

    # 3,Selma Cooper,97455,20090405 16:31:00,1000,9.99,9990,Pre-Approach # 4,Allen James,95140,20090405 16:31:00,1000,9.99,9990,New-Opportunity # 3盤目のフィールドの合計 # AWK cat test.csv | awk -F, 'BEGIN {total = 0}{ total+=$3 }END {print "Total:" total}' # PowerShell test like cat test.csv | %{$total=0}{$total += $_.Split(",")[2]}{"Total: " + $total} # PowerShell Object like Import-Csv -Delimiter "," -Path test.csv -Header num,name,num2,dt,num3,num4,num5,stat | measure -Sum num2
  57. PowerShell なら cmdよりシェルスクリプトに近い書き心地!

  58. None
  59. 今後の cmd / vbs に発展はない 新しいプロダクトは PowerShell に対応 今後の管理、開発を楽にするためにも早めの移行を!

  60. await

  61. None