Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
1
PowerShell が苦手だった男が
PowerShell を愛するようになるまで
ガブ / @gab_km
2014/07/12
第 3 回 PowerShell 勉強会
2
お前だれよ
● 拝承系 SIer 勤務のしがないエンジニア
● .NET 開発者、特に F# 界隈の人
● Python や D 言語にも興味あり
● もちろん PowerShell もね!
3
今日話すこと
● PowerShell が苦手→書けるようになった
● どの辺りが分かれば苦手意識がなくなるか
4
かつての僕
5
かつての僕
この時点 (2011/03/24) の 2 年前なので、 2009 年頃には
PowerShell に手を出していた模様。
6
何が苦手だったか
という感じの躓き方をしていた。
当時の記憶を思い出してみると、
● コマンド体系が bat から結構変わっている ( ように見えた )
● 今まで bat で出来ていたことが、 PowerShell だとすぐに出
来なかった
7
今はどうか
8
今はどうか
これが去年 (2013) の春のこと。
1 年ちょっと、いろんなものを PowerShell で書くようにし
ていたら、それなりに出来るようになってきた。
9
実例その 1
当初 bat で PC の起動時処理 ( メーラーや便利ツールの起動、
ファイルサーバーとの接続など ) を書いていた。
10
実例その 1
当初 bat で PC の起動時処理 ( メーラーや便利ツールの起動、
ファイルサーバーとの接続など ) を書いていた。
              ↓
Python を覚えて、これらの起動時処理を Python で全て書き...
11
実例その 1
当初 bat で PC の起動時処理 ( メーラーや便利ツールの起動、
ファイルサーバーとの接続など ) を書いていた。
              ↓
Python を覚えて、これらの起動時処理を Python で全て書き...
12
実例その 2
13
実例その 2
Chocolatey がなかなか良い感じなんだけど、某拝承系 SIer
の作業環境はプロキシの壁の中。
なので、 chocolatey install がプロキシ経由でも上手く
いくように Pull Request を投げて...
14
実例その 2
Chocolatey がなかなか良い感じなんだけど、某拝承系 SIer
の作業環境はプロキシの壁の中。
なので、 chocolatey install がプロキシ経由でも上手く
いくように Pull Request を投げて...
15
実例その 3
16
実例その 3
# どこのメーカーかはお察し
Get-ChildItem |
Where { $_.Name.StartsWith("MAKERNAME") } |
ForEach { Rename-Item $_ -newname ($(...
17
何が分かって苦手じゃなくなったか
この辺りができるように調べながらやり方を覚えていくことで
PowerShell を書くことが苦手じゃなくなった。
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
18
何が分かって苦手じゃなくなったか
この辺りができるように調べながらやり方を覚えていくことで
PowerShell を書くことが苦手じゃなくなった。
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
もし Power...
19
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
20
ファイルの指定と実行
PS> notitle.ps1
カレントディレクトリに作成した notitle.ps1 というスク
リプトファイル。
これを実行しようと上のように入力してみた。
うまく行けば “ Hello, there!” という...
21
ファイルの指定と実行
PS> notitle.ps1
notitle.ps1 : 用語 'notitle.ps1' は、コマンドレット、関数、スクリ
プト ファイル、または操作可能なプ
ログラムの名前として認識されません。名前が正しく記述...
22
ファイルの指定と実行
PS> notitle.ps1
notitle.ps1 : 用語 'notitle.ps1' は、コマンドレット、関数、スクリ
プト ファイル、または操作可能なプ
ログラムの名前として認識されません。名前が正しく記述...
23
ファイルの指定 (1) 絶対パスを使う
PS> C:myposhnotitle.ps1
24
ファイルの指定 (1) 絶対パスを使う
PS> C:myposhnotitle.ps1
Hello, there!
PS>
これは確実な方法だが、多少冗長な面は否めない。
25
ファイルの指定 (2)'.' を使う
PS> .notitle.ps1
26
ファイルの指定 (2)'.' を使う
PS> .notitle.ps1
Hello, there!
PS>
カレントディレクトリにあるファイルを指定したい場合、パス
の先頭に '.' を付与する。
27
ファイルが実行できない場合
PS> $myScript = “C:myposhnotitle.ps1”
PS> $myScript
ファイルを実行する際、先述の方法では上手くいかない場合が
ある。
28
ファイルが実行できない場合
PS> $myScript = “C:myposhnotitle.ps1”
PS> $myScript
C:myposhnotitle.ps1
PS>
29
ファイルが実行できない場合
PS> $myScript = “C:myposhnotitle.ps1”
PS> $myScript
C:myposhnotitle.ps1
PS>
実行後、周囲に漂うソウジャナイヨ感は、殺伐としたギョー...
30
ファイルの実行 (1) '&' を使う
PS> & $myScript
Hello, there!
PS>
こういう場合、実行したいパスをアンパサンド (&) に渡すこ
とで実行できる。
アンパサンドとパスは、間のスペースの有無にかかわら...
31
ファイルの実行 (2) '.' を使う
PS> . $myScript
Hello, there!
PS>
同じような場面で、ドット (.) を使うことで指定したパスに
あるファイルを実行する。
この方法を「ドットソース形式での読み込み」...
32
ファイルの実行 (2) '.' を使う
PS> . $myScript
Hello, there!
PS>
同じような場面で、ドット (.) を使うことで指定したパスに
あるファイルを実行する。
この方法を「ドットソース形式での読み込み」...
33
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
34
ファイルに対する操作
● コピー
● リネーム
● 削除
ファイルに対して、以下の操作を行いたいことが多かった。
35
ファイルに対する操作
古き良きコマンドプロンプトのコマンドを使えなくはない。
… が、せっかく PowerShell に手を出したんだから、コマン
ドレットを使いたいという意識の高さがあった。
● コピー
● リネーム
● 削除
ファイル...
36
ファイルのコピー (1)
PS> Copy-Item -Path .notitle.ps1 -Destination C:myetc
PS> ls C:myetc | where Name -eq notitle.ps1
ディレクトリ :...
37
ファイルのコピー (2)
PS> Get-ChildItem C:myetc | % { $_.Name }
PS> Copy-Item -Path C:myposhn* -Destination C:myetc
PS> Get-Chil...
38
ファイルのコピー (2)
PS> Get-ChildItem C:myetc | % { $_.Name }
PS> Copy-Item -Path C:myposhn* -Destination C:myetc
PS> Get-Chil...
39
ファイルのリネーム
PS> ls | % { $_.Name }
notitle.ps1
PS> Rename-Item -Path .notitle.ps1 -NewName foobar.ps1
PS> ls | % { $_.Nam...
40
ファイルの削除
PS> ls | % { $_.Name }
notitle.ps1
PS> Remove-Item .notitle.ps1
PS> ls | % { $_.Name }
PS>
Remove-Item を使う。
41
ファイルの削除
PS> ls | % { $_.Name }
notitle.ps1
PS> Remove-Item .notitle.ps1
PS> ls | % { $_.Name }
PS>
Remove-Item を使う。
Pow...
42
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
43
パイプライン操作
「 PowerShell といえばパイプライン、
44
パイプライン操作
「 PowerShell といえばパイプライン、
 パイプラインといえば F# PowerShell 」という関係。
45
パイプライン操作
の 2 つに大別されると思う。 (※ 個人の感想です )
● フィルター
● 逐次
「 PowerShell といえばパイプライン、
 パイプラインといえば F# PowerShell 」という関係。
パイプラインでやり...
46
パイプライン操作 - フィルター
@("hoge", "fuga", "bar") | where { $_.Length -eq 4 }
# "hoge"
# "fuga"
パイプラインの基本操作といえば、やはりフィルター。
条件ブロッ...
47
パイプライン操作 - フィルター
@("hoge", "fuga", "bar") | where { $_.Length -eq 4 }
# "hoge"
# "fuga"
パイプラインの基本操作といえば、やはりフィルター。
条件ブロッ...
48
パイプライン操作 - 逐次 (1)
@("hoge", "fuga", "bar") | foreach { $_.ToUpper() }
# "HOGE"
# "FUGA"
# “BAR”
パイプラインで渡されたコレクションの各要素に対...
49
パイプライン操作 - 逐次 (2)
@(1 .. 3) | % { $_ + 2 }
# 3
# 4
# 5
foreach には % という略記号が用意されているので便利。
50
今日話したこと
● PowerShell が苦手→書けるようになった
● どの辺りが分かれば苦手意識がなくなるか
51
今日話したこと
● PowerShell が苦手→書けるようになった
● どの辺りが分かれば苦手意識がなくなるか
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
52
今日話したこと
● PowerShell が苦手→書けるようになった
● どの辺りが分かれば苦手意識がなくなるか
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
すごい PowerShell いっぱい遊ぼう!
Upcoming SlideShare
Loading in …5
×

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

24,438 views

Published on

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

Published in: Technology
  • Be the first to comment

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 いっぱい遊ぼう!

×