PowerShell 手習い

作成日:2016-07-03
最終更新日:

PowerShell について述べる。

PowerShell とは

PowerShell とは、Microsoft 社のオペレーティングシステムで作動する各種プログラムを、 コマンドラインで作成・参照・更新・削除できるしくみである。

コマンドラインを起動するには、すべてのアプリから、Windows PowerShell を選ぶ。Windows 10 では、 (x86) があるものとないもの、ISE がついているものとついていないものとで計4種類の組み合わせがあるが、 どちらもついていないものを選べばよい。

PowerShell のバージョン

コマンドプロンプトが出ている画面で、単に $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 ファイルの取り込みと加工

次のような 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東日本大震災

Excel と PowerShell

PowerShell を使って、複数の Excel ファイルから固定シートの固定セルの値を拾って読むことを考える。 「平成 27 年」という名前のフォルダーに複数の Excel ファイル(ブック)がある。1ブックにつきシートは1枚だけで、次のような表になっている。

utsunomiya.xlsx

ABCDEF
1日出h日出m日入h日入m
2116521642

これは、都市 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 手習い


MARUYAMA Satosi