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 で全て書き
直した。 (Python の勉強に役立った )
11
実例その 1
当初 bat で PC の起動時処理 ( メーラーや便利ツールの起動、
ファイルサーバーとの接続など ) を書いていた。
              ↓
Python を覚えて、これらの起動時処理を Python で全て書き
直した。 (Python の勉強に役立った )
              ↓
PowerShell の勉強のために、起動時処理を PowerShell で
改めて書き直した。
12
実例その 2
13
実例その 2
Chocolatey がなかなか良い感じなんだけど、某拝承系 SIer
の作業環境はプロキシの壁の中。
なので、 chocolatey install がプロキシ経由でも上手く
いくように Pull Request を投げてみた。
14
実例その 2
Chocolatey がなかなか良い感じなんだけど、某拝承系 SIer
の作業環境はプロキシの壁の中。
なので、 chocolatey install がプロキシ経由でも上手く
いくように Pull Request を投げてみた。
※2014/07/12 現在、絶賛放置中
15
実例その 3
16
実例その 3
# どこのメーカーかはお察し
Get-ChildItem |
Where { $_.Name.StartsWith("MAKERNAME") } |
ForEach { Rename-Item $_ -newname ($(Get-ItemProperty
$_).LastWriteTime.ToString("yyyyMMdd_hhmm") + ".MP4") }
17
何が分かって苦手じゃなくなったか
この辺りができるように調べながらやり方を覚えていくことで
PowerShell を書くことが苦手じゃなくなった。
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
18
何が分かって苦手じゃなくなったか
この辺りができるように調べながらやり方を覚えていくことで
PowerShell を書くことが苦手じゃなくなった。
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
もし PowerShell に苦手意識を感じている方でも、この 3 つ
ができれば、最初の大きなハードルが乗り越えられると思う。
19
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
20
ファイルの指定と実行
PS> notitle.ps1
カレントディレクトリに作成した notitle.ps1 というスク
リプトファイル。
これを実行しようと上のように入力してみた。
うまく行けば “ Hello, there!” という文字列が表示され
る。
21
ファイルの指定と実行
PS> notitle.ps1
notitle.ps1 : 用語 'notitle.ps1' は、コマンドレット、関数、スクリ
プト ファイル、または操作可能なプ
ログラムの名前として認識されません。名前が正しく記述されていることを確認
し、パスが含まれている場合
はそのパスが正しいことを確認してから、再試行してください。
発生場所 行 :1 文字 :1
+ notitle.ps1
+ ~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound:
(notitle.ps1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS>
22
ファイルの指定と実行
PS> notitle.ps1
notitle.ps1 : 用語 'notitle.ps1' は、コマンドレット、関数、スクリ
プト ファイル、または操作可能なプ
ログラムの名前として認識されません。名前が正しく記述されていることを確認
し、パスが含まれている場合
はそのパスが正しいことを確認してから、再試行してください。
発生場所 行 :1 文字 :1
+ notitle.ps1
+ ~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound:
(notitle.ps1:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
PS>
ターミナル上では補完が効く話ではあるけれど、単純に .bat
から .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>
同じような場面で、ドット (.) を使うことで指定したパスに
あるファイルを実行する。
この方法を「ドットソース形式での読み込み」と言う。
詳しくは検索するか、会場にいる PowerShell のこわい人た
ちに聞いてみてください ( ◜◡◝ )
33
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
34
ファイルに対する操作
● コピー
● リネーム
● 削除
ファイルに対して、以下の操作を行いたいことが多かった。
35
ファイルに対する操作
古き良きコマンドプロンプトのコマンドを使えなくはない。
… が、せっかく PowerShell に手を出したんだから、コマン
ドレットを使いたいという意識の高さがあった。
● コピー
● リネーム
● 削除
ファイルに対して、以下の操作を行いたいことが多かった。
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
ファイルのコピー (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
ファイルのコピー (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
ファイルのリネーム
PS> ls | % { $_.Name }
notitle.ps1
PS> Rename-Item -Path .notitle.ps1 -NewName foobar.ps1
PS> ls | % { $_.Name }
foobar.ps1
PS>
こちらも、とりあえず Rename-Item を使う。
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 を使う。
PowerShell は「動詞 - 目的語」という名前でコマンドレッ
トが定義されており、直感的に探しやすい。
42
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
43
パイプライン操作
「 PowerShell といえばパイプライン、
44
パイプライン操作
「 PowerShell といえばパイプライン、
 パイプラインといえば F# PowerShell 」という関係。
45
パイプライン操作
の 2 つに大別されると思う。 (※ 個人の感想です )
● フィルター
● 逐次
「 PowerShell といえばパイプライン、
 パイプラインといえば F# PowerShell 」という関係。
パイプラインでやりたい操作といえば
46
パイプライン操作 - フィルター
@("hoge", "fuga", "bar") | where { $_.Length -eq 4 }
# "hoge"
# "fuga"
パイプラインの基本操作といえば、やはりフィルター。
条件ブロックを渡した Where-Object を通すことで、その
条件にマッチした要素だけが残る。
47
パイプライン操作 - フィルター
@("hoge", "fuga", "bar") | where { $_.Length -eq 4 }
# "hoge"
# "fuga"
パイプラインの基本操作といえば、やはりフィルター。
条件ブロックを渡した Where-Object を通すことで、その
条件にマッチした要素だけが残る。
$_ はパイプライン先で要素を指す変数。
パイプライン操作を覚え始めた頃は、何故か覚えられなくてい
つもぐぐっていた…。
48
パイプライン操作 - 逐次 (1)
@("hoge", "fuga", "bar") | foreach { $_.ToUpper() }
# "HOGE"
# "FUGA"
# “BAR”
パイプラインで渡されたコレクションの各要素に対し
て、 ForEach-Object に渡したブロックの処理を行う。
皆さんがお使いの関数型言語でいうところの、 map や iter と
だいたい同じ役割になる。
49
パイプライン操作 - 逐次 (2)
@(1 .. 3) | % { $_ + 2 }
# 3
# 4
# 5
foreach には % という略記号が用意されているので便利。
50
今日話したこと
● PowerShell が苦手→書けるようになった
● どの辺りが分かれば苦手意識がなくなるか
51
今日話したこと
● PowerShell が苦手→書けるようになった
● どの辺りが分かれば苦手意識がなくなるか
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
52
今日話したこと
● PowerShell が苦手→書けるようになった
● どの辺りが分かれば苦手意識がなくなるか
● ファイルの指定と実行
● ファイルに対する操作
● パイプライン操作
すごい PowerShell いっぱい遊ぼう!

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