この投稿は インタープリズム的「俺達私達の進捗を上げる25個前後のTips」 Advent Calendar 2015 - Qiitaの17日目 の記事です。
こんにちは。hayashiです。
現在はWindowsで仕事をしています。 業務内容的にGUIでは完結していない関係で、 PowerShellというものが実はけっこう便利だということを知りました。
今回は
- PowerShellって何?
- 自宅ではOS Xのターミナルで作業してるけど会社ではWindows
- WindowsだけどCygwin入れて作業してる
という方向けにPowerShellをご紹介したいと思います。
PowerShell
Windowsでコマンドラインというと、一番知られているのはコマンドプロンプトではないかと思います。
しかし、コマンドプロンプト上でUNIX系OSのシェル上で行うような作業をしようとすると、つらくなってきます。 CygwinなどのUNIX系環境をWindowsに持ち込みたくなります。
でも実は、コマンドプロンプトよりもずっと高機能なコマンドラインシェル&スクリプト言語が、 Windows7以降には標準で入っています。 それがPowerShellです。 場面によっては、UNIXのシェルよりも強力です。
Windows7のスタートメニューではアクセサリ→Windows PowerShellにあります。
なお、以下で紹介するスクリプトの動作確認はPowerShellバージョン4.0で行っています。
見慣れたUNIXのコマンド(見た目)使えます
UNIXのシェル上でよく使われるコマンドが、 PowerShellのコマンド(コマンドレットと呼ばれます)のエイリアスとして登録されています。
例えば、
- ls → Get-ChildItem
- cat → Get-Content
- cp → Copy-Item
- mv → Move-Item
- rm → Remove-Item
- curl → Invoke-WebRequest
- diff → Compare-Object
などのようにです。 エイリアスの一覧は alias または Get-Alias で表示されます。
ただし、残念ながらパラメーターまで同じではありません。 コマンドレットのヘルプは help または Get-Help で見られます。
シェルプログラミングできます
一般的なプログラミング言語にあるような制御構造とデータ構造が用意されています。 もちろん、スクリプトファイルの形で実行することもできます。
PowerShellが変わっている点の1つは、コマンドレットの実行結果がオブジェクトになっていて、 そのオブジェクトをパイプで次のコマンドレットに渡すこともできる点です。
この方法でとてもよく使うコマンドレットの内、 今回は次の5つについて例を挙げて紹介したいと思います。
- select → Select-Object
- where → Where-Object
- foreach → ForEach-Object
- group → Group-Object
- sort → Sort-Object
ファイル名一括変更
カレントディレクトリにあるファイル名が数字だけでできているテキストファイルについて、 ファイル名の先頭にtmpを挿入する。
Get-ChildItem *.txt | where { $_.BaseName -match '^\d+$' } | foreach { Rename-Item $_.FullName ($_.Name -replace '^', 'tmp') }
プロセス操作
「power」で始まるプロセスの使用CPUコアを4番目のコアだけに限定する
Get-Process power* | foreach { $_.ProcessorAffinity = 8 }
ファイル検索
カレントディレクトリにあるtmpディレクトリ以下のファイルを再帰的に調べて、 異なるディレクトリに大文字小文字を区別して同名のファイルがあるもののフルパスを表示する。
Get-ChildItem tmp -File -Recurse | group Name -CaseSensitive | where { $_.Count -gt 1 } | foreach { $_.Group | sort Directory -CaseSensitive | select FullName }
流れるように処理が記述できるところが私は気に入っています。
.NETのライブラリが直接使えます
何と、 .NETのライブラリ をスクリプトから直接呼び出すことができます。
ランダムな10個のGUIDを大文字で生成する。
1..10 | foreach { [Guid]::NewGuid().ToString().ToUpper() }
地味に、生成して使うことがあります。 なお、.NETとは関係ありませんが、上記の1..10では1, 2, 3, ..., 10の配列が生成されています。
まとめ
いかがでしたでしょうか?
今回ご紹介したのはPowerShellの機能の一部分ですが、 その強力さの片鱗だけでもお伝えできていれば幸いです。
Windowsで作業される方はぜひ作業環境の選択肢に加えて試してみていただければと思います。
おまけ
弊社ブログのRSSを取得して今年12月以降のエントリーを取り出し、 日付とタイトルを日付の昇順でソートして文字コードUTF8でCSVに保存する。
Invoke-RestMethod http://interprism.hatenablog.com/rss | select @{ Name = "日付"; Exp = { ([DateTime]$_.pubDate).ToShortDateString() } }, title | where { $_.日付 -ge "2015/12/01" } | sort 日付 | ConvertTo-Csv -NoTypeInformation | Out-File blogtitles.csv -Encoding utf8
IDE
スクリプトファイルの編集はお気に入りのテキストエディタでしても構いませんが、 PowerShellと一緒に入っているPowerShell ISEを使うとある程度補完が効いたりします。
情報源
検索してお好きなところでよいと思いますが、 私は公式の以下をよく参照しています。
インタープリズム的「俺達私達の進捗を上げる25個前後のTips」 Advent Calendar 2015 - Qiitaの18日目の記事