Windows PowerShellスクリプト作成の基礎知識
2015年3月28日株式会社アスラ 林 茂之
(Windows PowerShellを紐解くシリーズ 第3回目)
I try to tease the Windows PowerShell
自己紹介
氏名 林 茂之 (はやし しげゆき)
得意分野インフラ構築プロジェクトマネージメント
今の仕事 会社経営
趣味 読書(ゴルゴ13 他)お酒(洋酒、日本酒、焼酎など全般)
特徴 アイドル好きが痛い46歳まゆゆ 押し歴 5年
本日のアジェンダ
Windows PowerShellスクリプト作成の基礎知識
1.これまでのおさらい
2. Windows PowerShellスクリプトの特徴
3.PowerShellで扱う変数
4.PowerShellの制御構文
5.PowerShellスクリプトの実行例
2015年1月17日(秋田)、1月24日(品川)で「Windows PowerShellを紐解く」と題し、PowerShell開発の歴史とPowerShellの高度な管理機能について説明しました。
その「おさらい」を少しだけ。
1.PowerShellはWMI(Windows Management Instrumentation)を利用して、オブジェクト(Registry、Event Log、IIS、Cluster etc.)を操作する
→ コマンドレットを実行すると、.NET Frameworkのオブジェクトを返す
2.PowerShellはコマンドレット(PowerShellに用意された命令)を使って処理を実現する
3.コマンドレットは「動詞」-「名詞」の形式で記述する例:Get-Process
4.コマンドレットは、パラメータを指定して処理を実行することができる例:Get-Process –Name explorer
これまでのおさらい
PowerShellのスクリプトファイル
スクリプトファイルの基本は、単純なプレーンテキストファイル
プレーンテキスト(Plain text)とは、コンピュータ上で文書を扱うための一般的なファイルフォーマット。本文以外に付加情報(レイアウト情報など)を持たない単純に文字だけで構成される。
例 ○ Windowsのメモ帳(notepad)× HTML
PowerShellのスクリプトファイルも、Windowsのメモ帳で作成することができる。
「スクリプト」と難しそうな名前で呼ばれているが、その実態はファイルとして保存されたコマンドレットの集合体といった一面もある。
PowerShellのスクリプト
PowerShellのスクリプトファイルの拡張子は .ps1
Windows PowerShellでスクリプトファイルを作成する場合、拡張子は .ps1 となる
例: hogehoge_script.ps1
【特徴】ps1の「1」は、PowerShellのバージョンではなく、言語エンジンのバージョンを表している。
PowerShellのスクリプト
PowerShellのスクリプトファイルを使用する際の注意点
1.拡張子.ps1のスクリプトファイルは、ダブルクリックしても実行されない。
ダブルクリックによるウィルス実行(展開)を回避する目的があるとも言われている
2.カレントフォルダを検索しない
フルパスで指定か、「./<スクリプト名>」で実行例: ./PowerShellTest.ps1
※コマンド・プロンプトでは、ファイル名の指定のみで実行可能
3.スクリプト実行ポリシーを設定する→ これを適切に設定しないとPowerShellスクリプトは起動しない
PowerShellのスクリプト
PowerShellのスクリプトファイルを使用する際の注意点
現在の実行ポリシーを確認する→ Get-ExecutionPolicy コマンドレットを使用した確認
PowerShellを「管理者として実行する」
Get-ExecutionPolicyコマンドレットを実行し、現在の設定を確認する
PowerShellのスクリプト
PowerShellのスクリプトファイルを使用する際の注意点
スクリプト実行ポリシーを設定する→ Set-ExecutionPolicy <引数>
引数 引数の詳細
Restrictedすべてのスクリプトを実行不可。PowerShell、Windows OSインストール時のデフォルト設定(Windows Server 2012 R2を除く)
AllSigned 署名されているスクリプトのみ実行可能
RemoteSignedインターネット経由からダウンロードした署名のあるスクリプトのみ実行可能
Unrestrictedすべてのスクリプト実行を許可(ただしインターネット経由でダウンロードしたコードは実行確認のみあり)
Bypass 警告やユーザへの確認なしに、すべてのスクリプトが実行可能
PowerShellのスクリプト
PowerShellのスクリプトファイルを使用する際の注意点
スクリプト実行ポリシーを設定する→ Set-ExecutionPolicy コマンドレットを使用した設定
PowerShellのスクリプト
PowerShellのスクリプトファイルを使用する際の注意点
そして・・・
そして・・・
そして・・・
Surface RTでは、PowerShellで実行できる機能に制限があります。
これは最後に。
PowerShellで扱う変数
PowerShellで扱う変数の特徴
1.基本事項(お約束)
PowerShellに限らず、スクリプトを記述するうえで大事なものが「変数」である。PowerShellにおいては、他のスクリプトと同様、あらかじめ変数の宣言をする必要はない。
(注意) VBScriptは変数宣言が必要(らしいですね)
2.変数の命名規則
① 先頭文字が「$」で始まること② 2文字目以降は任意の英数字、またはアンダースコアであること例 ${DotNetLabo}
$_
PowerShellで扱う変数
PowerShellで扱う変数の特徴
3.変数のデータ型
PowerShellはデータ型を区別しない言語である。
→ データ型を宣言する必要はないが、宣言することについても何ら問題はない。→ 宣言しない場合は、PowerShellが自動的に正しいデータ型にしてくれる。
→ Get.Typeメソッドで確かめる$x = 123$x.GetType() ← .NET Frameworkの Object.GetType メソッド
でも。ちょっと問題もある。
PowerShellで扱う変数
PowerShellで扱う変数の特徴
4.加算演算子を使用する際の注意点
PowerShellはデータ型を区別しない言語である。→ Get.Typeメソッドで確かめる
正しいデータ型にしてくれている例
PowerShellで扱う変数
PowerShellで扱う変数の特徴
4.加算演算子の注意点
PowerShellはデータ型を区別しない(動的認識する)言語である。が!注意しないといけないこともある。
それは「 + 」(足す)です。
PowerShellの「 + 」には、加算演算子と文字列連結演算子の役割がある。
PowerShellで扱う変数
PowerShellで扱う変数の特徴
4.加算演算子の注意点
記述上の注意が必要。覚えてしまえば問題ないことだが、複雑なコードになる場合、誤りを生む原因になる。
「文字列」+「数値」の場合の演算結果
「数値」+「文字列」の場合の演算結果
PowerShellで扱う変数
PowerShellで扱う変数の特徴
4.加算演算子の注意点
先の問題については、変数の型を宣言して回避することができる
Int型(整数型)を宣言する変数に小数点のある値を入れる四捨五入した値に変換される
Int型(整数型)を宣言した変数に文字列を入れると、変換できずエラーになる
PowerShellで扱う変数
PowerShellで扱う変数の特徴
5.文字列の展開
シングルクォート/ダブルクォートの使い方
変数値をダブルクォートで囲むと、コマンドレットの実行結果として「変数展開」が行われる
変数値をシングルクォートで囲むと、コマンドレットの実行結果として、そのまま出力される
PowerShellで扱う変数
PowerShellで扱う変数の特徴
5.文字列の展開
シングルクォート/ダブルクォートの使い方(エスケープシーケンスはどうなるか? `n(改行)の場合)
変数値をダブルクォートで囲むと、コマンドレットの実行時にエスケープシーケンスが認識される
変数値をシングルクォートで囲むと、コマンドレットの実行エスケープシーケンスが認識されない
PowerShellで扱う変数
PowerShellで扱う変数の特徴
6.ヒア・ドキュメント
ヒア・ドキュメント(here document)とは、大量のテキストをスクリプト内で記述する仕組み。
記載方法:@”<改行>~<改行>“@ もしくは @’ <改行>~<改行>’@
ヒア・ドキュメントの開始変数$docに下記のテキストを格納する
ヒア・ドキュメントの終了
PowerShellで扱う変数
PowerShellで扱う変数の特徴
7.変数の値の削除
変数にセットされた値の削除
Remove-Variable コマンドレットの後に変数名をつける(注意)「$」はつけません。
Remove-Variable abc
PowerShellで扱う変数
PowerShellで扱う変数の特徴
8.配列(array)
ある関係を持つ複数の値を格納できる変数
記述方法 @(要素,要素,要素)
$array = 1,2,3,4 と書いても良い。オブジェクトを「,」で区切れば配列になる。
配列の先頭を0と数えることに注意する。
PowerShellで扱う変数
PowerShellで扱う変数の特徴
9.連想配列(assosiative array)
配列内にあるデータにアクセスする際、添え字にスカラー数値以外のデータ型(文字列など)を使用できる配列
記述方法 @{キー名=値;キー名=値;‥‥}
LOCATIONの値を出力
PowerShellの制御構文
PowerShellの制御構文について
1. 条件分岐処理(if文)
PowerShellにおける条件分岐は「if , elseif , else」で構成される
If (条件) {ifが満たされた場合に実行される処理
} elseif (条件) {elseifの条件が満たされた場合に実行される処理
} else {ifの条件も、elseifの条件も満たされない場合に実行される処理
}
PowerShellの制御構文
PowerShellの制御構文について
2. 条件分岐処理(switch文)
Switch文は、処理を分岐するほか、パターン照合や反復を行うことができる
Switch –options (評価する式){
<パターン> { 実行する処理 }<パターン> { 実行する処理 }
:default { 実行する処理 }
}
PowerShellの制御構文
PowerShellの制御構文について
2. 条件分岐処理(switch文)
Switch文は、処理を分岐するほか、パターン照合や反復を行うことができる
パターン照合で一致する例 パターン照合で不一致になる例
PowerShellの制御構文
PowerShellの制御構文について
3. ループ処理(for文)
基本的なループ構文
for (初期化; 条件; 繰り返し処理){
繰り返し実行する処理}
4. ループ処理(while文)
指定した条件がtrue(真)の場合にループする構文
while (条件){
繰り返し実行する処理}
PowerShellスクリプトの実行例
フォルダの容量を取得し、Excel (csvファイル)へ出力する
Get-ChlidItemコマンドレットの実行時、フォルダの容量(Length)が表示されない。そこで、フォルダ容量を算出し、Excelへ出力する。
PowerShellスクリプトの実行例
フォルダの容量を取得し、Excel (csvファイル)へ出力する
スクリプトの記載例
Set-Location -path C:\work$filename = "C:\work\FolderSize.csv"
$output = Get-ChildItem | Select-Object Name,@{name="Size(byte)";expression={(Get-ChildItem $_.FullName -Recurse -Force |Measure-Object Length -Sum).Sum}}
$output | Export-Csv $filenameInvoke-Item $filename
PowerShellスクリプトの実行例
Internet Explorerを起動後、検索サイトを表示しキーワード検索を行う
スクリプトの記載例
$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $true
$ie.Navigate('http://www.bing.com/')
While($ie.Busy) { [Threading.Thread]::Sleep(300) }::
PowerShellスクリプトの実行例
Internet Explorerを起動し、検索サイト bing を表示する
スクリプトの実行例
New-Object : 型を作成できません。この言語モードでは、コアの型のみがサポートされています。発生場所 C:\work\PS_TEST\IE.ps1:1 文字:7+ $ie = New-Object -ComObject InternetExplorer.Application+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (:) [New-Object], PSNotSupportedException+ FullyQualifiedErrorId : CannotCreateComTypeConstrainedLanguage,Microsoft.PowerShell.
Commands.NewObjectCommand
PowerShellスクリプトの実行例
Surface RT(Windows RT)での制限
「この言語モードでは、コアの型のみがサポートされています。」について
RunSpaceの言語モードの違い
Surface RT(Windows RT)の場合は、「ConstraindLanguage」
Windows 8などの場合は、「FullLanguage」
因みにConstraindとは・・・「制限付き」という意味
まとめ
1.スクリプト実行ポリシーを設定するGet-ExecutionPolicy コマンドレットを使用した確認Set-ExecutionPolicy コマンドレットを使用した設定
2.変数や配列の考え方は、他の言語と共通するものが多くコーディング経験があれば、比較的早く理解・操作ができる
3.スクリプトの実行は、フルパスで指定か、「./<スクリプト名>」で実行例: ./PowerShellTest.ps1
4.Windows RTの場合、機能に制限がある点に注意
参考文献・参考Webサイト
Windows PowerShell クックブック (オライリー・ジャパン)
PowerShellの基礎 (@IT)http://www.atmarkit.co.jp/ait/articles/1004/15/news106_2.html
PowerShellスクリプティングの第一歩 (@IT)http://www.atmarkit.co.jp/ait/articles/0709/20/news125.html
PowerShellスクリプトの作成と実行 (Capm Network)http://capm-network.com/?tag=Windows設定
Windows PowerShell入門 (Code Zine) http://codezine.jp/article/detail/2388
PowerShell 逆引きリファレンスhttp://powershell.web.fc2.com/Html/Data/2011/11/03/0000.html
tech.guitarrapc.com http://tech.guitarrapc.com/
GitHub Gist https://gist.github.com/n-fukuju/8487498
Top Related