Successfully reported this slideshow.
Your SlideShare is downloading. ×

PowerShellが苦手だった男がPowerShellを愛するようになるまで

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad

Check these out next

1 of 52 Ad

PowerShellが苦手だった男がPowerShellを愛するようになるまで

Download to read offline

PowerShell とのお付き合い事始めです。初心者が PowerShell で躓くところ(実際引っかかった)を実体験を踏まえて紹介します。(主催者により記述編集)

PowerShell とのお付き合い事始めです。初心者が PowerShell で躓くところ(実際引っかかった)を実体験を踏まえて紹介します。(主催者により記述編集)

Advertisement
Advertisement

More Related Content

Slideshows for you (20)

Similar to PowerShellが苦手だった男がPowerShellを愛するようになるまで (20)

Advertisement

Recently uploaded (20)

PowerShellが苦手だった男がPowerShellを愛するようになるまで

  1. 1. 1 PowerShell が苦手だった男が PowerShell を愛するようになるまで ガブ / @gab_km 2014/07/12 第 3 回 PowerShell 勉強会
  2. 2. 2 お前だれよ ● 拝承系 SIer 勤務のしがないエンジニア ● .NET 開発者、特に F# 界隈の人 ● Python や D 言語にも興味あり ● もちろん PowerShell もね!
  3. 3. 3 今日話すこと ● PowerShell が苦手→書けるようになった ● どの辺りが分かれば苦手意識がなくなるか
  4. 4. 4 かつての僕
  5. 5. 5 かつての僕 この時点 (2011/03/24) の 2 年前なので、 2009 年頃には PowerShell に手を出していた模様。
  6. 6. 6 何が苦手だったか という感じの躓き方をしていた。 当時の記憶を思い出してみると、 ● コマンド体系が bat から結構変わっている ( ように見えた ) ● 今まで bat で出来ていたことが、 PowerShell だとすぐに出 来なかった
  7. 7. 7 今はどうか
  8. 8. 8 今はどうか これが去年 (2013) の春のこと。 1 年ちょっと、いろんなものを PowerShell で書くようにし ていたら、それなりに出来るようになってきた。
  9. 9. 9 実例その 1 当初 bat で PC の起動時処理 ( メーラーや便利ツールの起動、 ファイルサーバーとの接続など ) を書いていた。
  10. 10. 10 実例その 1 当初 bat で PC の起動時処理 ( メーラーや便利ツールの起動、 ファイルサーバーとの接続など ) を書いていた。               ↓ Python を覚えて、これらの起動時処理を Python で全て書き 直した。 (Python の勉強に役立った )
  11. 11. 11 実例その 1 当初 bat で PC の起動時処理 ( メーラーや便利ツールの起動、 ファイルサーバーとの接続など ) を書いていた。               ↓ Python を覚えて、これらの起動時処理を Python で全て書き 直した。 (Python の勉強に役立った )               ↓ PowerShell の勉強のために、起動時処理を PowerShell で 改めて書き直した。
  12. 12. 12 実例その 2
  13. 13. 13 実例その 2 Chocolatey がなかなか良い感じなんだけど、某拝承系 SIer の作業環境はプロキシの壁の中。 なので、 chocolatey install がプロキシ経由でも上手く いくように Pull Request を投げてみた。
  14. 14. 14 実例その 2 Chocolatey がなかなか良い感じなんだけど、某拝承系 SIer の作業環境はプロキシの壁の中。 なので、 chocolatey install がプロキシ経由でも上手く いくように Pull Request を投げてみた。 ※2014/07/12 現在、絶賛放置中
  15. 15. 15 実例その 3
  16. 16. 16 実例その 3 # どこのメーカーかはお察し Get-ChildItem | Where { $_.Name.StartsWith("MAKERNAME") } | ForEach { Rename-Item $_ -newname ($(Get-ItemProperty $_).LastWriteTime.ToString("yyyyMMdd_hhmm") + ".MP4") }
  17. 17. 17 何が分かって苦手じゃなくなったか この辺りができるように調べながらやり方を覚えていくことで PowerShell を書くことが苦手じゃなくなった。 ● ファイルの指定と実行 ● ファイルに対する操作 ● パイプライン操作
  18. 18. 18 何が分かって苦手じゃなくなったか この辺りができるように調べながらやり方を覚えていくことで PowerShell を書くことが苦手じゃなくなった。 ● ファイルの指定と実行 ● ファイルに対する操作 ● パイプライン操作 もし PowerShell に苦手意識を感じている方でも、この 3 つ ができれば、最初の大きなハードルが乗り越えられると思う。
  19. 19. 19 ● ファイルの指定と実行 ● ファイルに対する操作 ● パイプライン操作
  20. 20. 20 ファイルの指定と実行 PS> notitle.ps1 カレントディレクトリに作成した notitle.ps1 というスク リプトファイル。 これを実行しようと上のように入力してみた。 うまく行けば “ Hello, there!” という文字列が表示され る。
  21. 21. 21 ファイルの指定と実行 PS> notitle.ps1 notitle.ps1 : 用語 'notitle.ps1' は、コマンドレット、関数、スクリ プト ファイル、または操作可能なプ ログラムの名前として認識されません。名前が正しく記述されていることを確認 し、パスが含まれている場合 はそのパスが正しいことを確認してから、再試行してください。 発生場所 行 :1 文字 :1 + notitle.ps1 + ~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (notitle.ps1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PS>
  22. 22. 22 ファイルの指定と実行 PS> notitle.ps1 notitle.ps1 : 用語 'notitle.ps1' は、コマンドレット、関数、スクリ プト ファイル、または操作可能なプ ログラムの名前として認識されません。名前が正しく記述されていることを確認 し、パスが含まれている場合 はそのパスが正しいことを確認してから、再試行してください。 発生場所 行 :1 文字 :1 + notitle.ps1 + ~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (notitle.ps1:String) [], CommandNotFoundException + FullyQualifiedErrorId : CommandNotFoundException PS> ターミナル上では補完が効く話ではあるけれど、単純に .bat から .ps1 に書き換えてる時にこのつらみが…。
  23. 23. 23 ファイルの指定 (1) 絶対パスを使う PS> C:myposhnotitle.ps1
  24. 24. 24 ファイルの指定 (1) 絶対パスを使う PS> C:myposhnotitle.ps1 Hello, there! PS> これは確実な方法だが、多少冗長な面は否めない。
  25. 25. 25 ファイルの指定 (2)'.' を使う PS> .notitle.ps1
  26. 26. 26 ファイルの指定 (2)'.' を使う PS> .notitle.ps1 Hello, there! PS> カレントディレクトリにあるファイルを指定したい場合、パス の先頭に '.' を付与する。
  27. 27. 27 ファイルが実行できない場合 PS> $myScript = “C:myposhnotitle.ps1” PS> $myScript ファイルを実行する際、先述の方法では上手くいかない場合が ある。
  28. 28. 28 ファイルが実行できない場合 PS> $myScript = “C:myposhnotitle.ps1” PS> $myScript C:myposhnotitle.ps1 PS>
  29. 29. 29 ファイルが実行できない場合 PS> $myScript = “C:myposhnotitle.ps1” PS> $myScript C:myposhnotitle.ps1 PS> 実行後、周囲に漂うソウジャナイヨ感は、殺伐としたギョームにおける 一服の清涼剤となる。 # ならない
  30. 30. 30 ファイルの実行 (1) '&' を使う PS> & $myScript Hello, there! PS> こういう場合、実行したいパスをアンパサンド (&) に渡すこ とで実行できる。 アンパサンドとパスは、間のスペースの有無にかかわらず動作 する。
  31. 31. 31 ファイルの実行 (2) '.' を使う PS> . $myScript Hello, there! PS> 同じような場面で、ドット (.) を使うことで指定したパスに あるファイルを実行する。 この方法を「ドットソース形式での読み込み」と言う。
  32. 32. 32 ファイルの実行 (2) '.' を使う PS> . $myScript Hello, there! PS> 同じような場面で、ドット (.) を使うことで指定したパスに あるファイルを実行する。 この方法を「ドットソース形式での読み込み」と言う。 詳しくは検索するか、会場にいる PowerShell のこわい人た ちに聞いてみてください ( ◜◡◝ )
  33. 33. 33 ● ファイルの指定と実行 ● ファイルに対する操作 ● パイプライン操作
  34. 34. 34 ファイルに対する操作 ● コピー ● リネーム ● 削除 ファイルに対して、以下の操作を行いたいことが多かった。
  35. 35. 35 ファイルに対する操作 古き良きコマンドプロンプトのコマンドを使えなくはない。 … が、せっかく PowerShell に手を出したんだから、コマン ドレットを使いたいという意識の高さがあった。 ● コピー ● リネーム ● 削除 ファイルに対して、以下の操作を行いたいことが多かった。
  36. 36. 36 ファイルのコピー (1) PS> Copy-Item -Path .notitle.ps1 -Destination C:myetc PS> ls C:myetc | where Name -eq notitle.ps1 ディレクトリ : C:myetc Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2014/07/11 23:42 31 notitle.ps1 PS> とりあえず、 Copy-Item を使う。
  37. 37. 37 ファイルのコピー (2) PS> Get-ChildItem C:myetc | % { $_.Name } PS> Copy-Item -Path C:myposhn* -Destination C:myetc PS> Get-ChildItem C:myetc | % { $_.Name } Copy-Item の -Path パラメータ、ワイルドカードをmgmg してくれるので、以下のような使い方ができる。
  38. 38. 38 ファイルのコピー (2) PS> Get-ChildItem C:myetc | % { $_.Name } PS> Copy-Item -Path C:myposhn* -Destination C:myetc PS> Get-ChildItem C:myetc | % { $_.Name } notitle.ps1 nanimoyarukishinai.txt PS> Copy-Item の -Path パラメータ、ワイルドカードをmgmg してくれるので、以下のような使い方ができる。
  39. 39. 39 ファイルのリネーム PS> ls | % { $_.Name } notitle.ps1 PS> Rename-Item -Path .notitle.ps1 -NewName foobar.ps1 PS> ls | % { $_.Name } foobar.ps1 PS> こちらも、とりあえず Rename-Item を使う。
  40. 40. 40 ファイルの削除 PS> ls | % { $_.Name } notitle.ps1 PS> Remove-Item .notitle.ps1 PS> ls | % { $_.Name } PS> Remove-Item を使う。
  41. 41. 41 ファイルの削除 PS> ls | % { $_.Name } notitle.ps1 PS> Remove-Item .notitle.ps1 PS> ls | % { $_.Name } PS> Remove-Item を使う。 PowerShell は「動詞 - 目的語」という名前でコマンドレッ トが定義されており、直感的に探しやすい。
  42. 42. 42 ● ファイルの指定と実行 ● ファイルに対する操作 ● パイプライン操作
  43. 43. 43 パイプライン操作 「 PowerShell といえばパイプライン、
  44. 44. 44 パイプライン操作 「 PowerShell といえばパイプライン、  パイプラインといえば F# PowerShell 」という関係。
  45. 45. 45 パイプライン操作 の 2 つに大別されると思う。 (※ 個人の感想です ) ● フィルター ● 逐次 「 PowerShell といえばパイプライン、  パイプラインといえば F# PowerShell 」という関係。 パイプラインでやりたい操作といえば
  46. 46. 46 パイプライン操作 - フィルター @("hoge", "fuga", "bar") | where { $_.Length -eq 4 } # "hoge" # "fuga" パイプラインの基本操作といえば、やはりフィルター。 条件ブロックを渡した Where-Object を通すことで、その 条件にマッチした要素だけが残る。
  47. 47. 47 パイプライン操作 - フィルター @("hoge", "fuga", "bar") | where { $_.Length -eq 4 } # "hoge" # "fuga" パイプラインの基本操作といえば、やはりフィルター。 条件ブロックを渡した Where-Object を通すことで、その 条件にマッチした要素だけが残る。 $_ はパイプライン先で要素を指す変数。 パイプライン操作を覚え始めた頃は、何故か覚えられなくてい つもぐぐっていた…。
  48. 48. 48 パイプライン操作 - 逐次 (1) @("hoge", "fuga", "bar") | foreach { $_.ToUpper() } # "HOGE" # "FUGA" # “BAR” パイプラインで渡されたコレクションの各要素に対し て、 ForEach-Object に渡したブロックの処理を行う。 皆さんがお使いの関数型言語でいうところの、 map や iter と だいたい同じ役割になる。
  49. 49. 49 パイプライン操作 - 逐次 (2) @(1 .. 3) | % { $_ + 2 } # 3 # 4 # 5 foreach には % という略記号が用意されているので便利。
  50. 50. 50 今日話したこと ● PowerShell が苦手→書けるようになった ● どの辺りが分かれば苦手意識がなくなるか
  51. 51. 51 今日話したこと ● PowerShell が苦手→書けるようになった ● どの辺りが分かれば苦手意識がなくなるか ● ファイルの指定と実行 ● ファイルに対する操作 ● パイプライン操作
  52. 52. 52 今日話したこと ● PowerShell が苦手→書けるようになった ● どの辺りが分かれば苦手意識がなくなるか ● ファイルの指定と実行 ● ファイルに対する操作 ● パイプライン操作 すごい PowerShell いっぱい遊ぼう!

×