PowerShell 手習い |
作成日:2016-07-03 最終更新日: |
PowerShell について述べる。
PowerShell とは、Microsoft 社のオペレーティングシステムで作動する各種プログラムを、 コマンドラインで作成・参照・更新・削除できるしくみである。
コマンドラインを起動するには、すべてのアプリから、Windows PowerShell を選ぶ。Windows 10 では、 (x86) があるものとないもの、ISE がついているものとついていないものとで計4種類の組み合わせがあるが、 どちらもついていないものを選べばよい。
コマンドプロンプトが出ている画面で、単に $PSVersion と打ち込み、Enter キーを押せばよい。 下記は私の Windows 10 の環境である。
PS C:\Users\marinkyo> $PSVersionTable
Name Value
---- -----
PSVersion 5.0.10586.122
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.10586.122
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
次のような CSV ファイルがあるとしよう。
番号 ,年月日 ,緯度, 経度, マグニチュード, 1,日本語名称1 , 2,英語名称 , 3, 日本語別称 404 ,1995-01-17 ,34.6, 135.0, 7.3, 1, 兵庫県南部地震, 2, Kobe earthquake, 3, 阪神・淡路大震災 411 ,2001-03-24 ,34.1, 132.7, 6.7, 1, 芸予地震 414 ,2003-09-26 ,41.8, 144.1, 8.0, 1, 十勝沖地震 415 ,2004-10-23 ,37.3, 138.9, 6.8, 1, 新潟県中越地震 418 ,2007-03-25 ,37.2, 136.7, 6.9, 1, 能登半島地震 419 ,2007-07-16 ,37.6, 138.6, 6.8, 1, 新潟県中越沖地震 420 ,2008-06-14 ,39.0, 140.9, 7.2, 1, 岩手・宮城内陸地震 423 ,2011-03-11 ,38.1, 142.9, 9.0, 1, 東北地方太平洋沖地震, 2, Tohoku earthquake, 3, 東日本大震災
CSV ファイルを取り込むコマンドレット Import-CSV がある。これを使おう。
PS C:\Users\marinkyo> Import-CSV .\earthquake.csv -Encoding Default
すると次のように出力される。
| 番号 | : 404 |
| 年月日 | : 1995-01-17 |
| 緯度 | : 34.6 |
| 経度 | : 135.0 |
| マグニチュード | : 7.3 |
| 1 | : 1 |
| 日本語名称 | : 兵庫県南部地震 |
| 2 | : 2 |
| 英語名称 | : Kobe Earthquake |
| 3 | : 3 |
| 日本語別称 | : 阪神・淡路大震災 |
| (中略) | |
| 番号 | : 423 |
| 年月日 | : 2011-03-11 |
| 緯度 | : 38.1 |
| 経度 | : 142.9 |
| マグニチュード | : 9.0 |
| 1 | : 1 |
| 日本語名称 | : 東北地方太平洋沖地震 |
| 2 | : 2 |
| 英語名称 | : Tohoku earthquake |
| 3 | : 3 |
| 日本語別称 | : 東日本大震災 |
このように1レコードずつ清書されて出てくる。このように、第1行目を列の属性(アトリビュート)として解釈してくれる。
1レコードあたりの処理を行なうには、次のような分解できる。
Import-Csv 'servers.csv' | ForEach-Object {
$_."列の属性"
}
PS C:\Users\marinkyo> Import-CSV .\earthquake.csv -Encoding Default | ForEach-Object{
>> $_."年月日" +$_."1"+ $_."日本語名称1"+"`n"+ $_."年月日" + $_.3 + $_."日本語別称" }
1995-01-17 1兵庫県南部地震
1995-01-17 3阪神・淡路大震災
2001-03-24 1芸予地震
2001-03-24
2003-09-26 1十勝沖地震
2003-09-26
2004-10-23 1新潟県中越地震
2004-10-23
2007-03-25 1能登半島地震
2007-03-25
2007-07-16 1新潟県中越沖地震
2007-07-16
2008-06-14 1岩手・宮城内陸地震
2008-06-14
2011-03-11 1東北地方太平洋沖地震
2011-03-11 3東日本大震災
PowerShell を使って、複数の Excel ファイルから固定シートの固定セルの値を拾って読むことを考える。 「平成 27 年」という名前のフォルダーに複数の Excel ファイル(ブック)がある。1ブックにつきシートは1枚だけで、次のような表になっている。
utsunomiya.xlsx
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | 月 | 日 | 日出h | 日出m | 日入h | 日入m |
| 2 | 1 | 1 | 6 | 52 | 16 | 42 |
これは、都市 utsunomiya (宇都宮)の1月1日の日の出が 6 時 52 分であり、日の入りが 16 時 35 分であることを表している (理科年表 平成 27 年 暦 40 より)。 このようなブックで1月1日の日の出の時間を PowerShell表示する。
# hinode.ps1 param($file) # 引数に使う $file = (Get-ChildItem $file).FullName # オープンのためにフルネームにする $excel = New-Object -ComObject Excel.Application # Excel を扱うための準備をする $excel.Visible = $false # Excel を非表示 $book = $excel.Workbooks.Open($file) # フルネームで指定したブックを開く $sheet = $excel.Worksheets.Item(1) # 1 番目のシートを選択する $line = 2 # 第 2 行を選択する $hinodeh = $sheet.Cells.Item($line,3).Text # 第 2 行の第 3 列を選択する $hinodem = $sheet.Cells.Item($line,4).Text # 第 2 行の第 4 列を選択する Write-Host "$file : $hinodem " 時 "$hinodeh" 分 # 取得した情報を表示する $excel.Quit()
> .\hinode.ps1 .\utsunomiya
このシステムではスクリプトの実行が無効になっているため……
というエラーが表示され、実行されないようになっている。 これは PowerShell のポリシーである。
Set-ExectionPolicy RemoteSigned
実行ポリシーの変更 実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170) で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか? [Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"):
ここで何もせずに Return のみを押してしまうと、変更が反映されない。したがって確実に Y をクリックしよう。
さて、実行した結果は次の通りだ。
PS > .\hinode.ps1 utsunomiya.xlsx
C:\users\satosi\documents\powershell\utsunomiya.xlsx : 6 時 52 分
では次に、都市 hiroshima (広島)の日の出と同時に出してみよう。 広島は、1月1日の日の出が 7 時 16 分であり、日の入りが 17 時 11 分であることを表している (理科年表 平成 27 年 暦 34 より)。 hiroshima.xlsx に同じようなデータを作ってみたらどうだろうか。
PS > .\hinode.ps1 hiroshima.xlsx
C:\users\satosi\documents\powershell\hiroshima.xlsx : 7 時 16 分
まりんきょ学問所 > コンピュータの部屋 > Windows 手習い > PowerShell 手習い