PowerShell基礎解説の後編。スクリプトを組むための基本となる変数や制御構文、関数、.NET Frameworkクラスの利用方法について解説する。
本連載では、Windowsの次世代シェルであるWindows PowerShell(以下PowerShell)の基本的な機能を理解していただくことを目的としている。前編では、まずPowerShellの基本的な概念を理解していただくという意味で、より手軽に扱える対話型シェルを中心に解説を進めた。しかし、PowerShellの最終的な目標はスクリプティング技術によるシステム運用の自動化である。後編の今回は、前回の内容を踏まえて、PowerShell上でスクリプトを利用するための基礎について解説していく。
具体的には、最初にスクリプトを実行するための基本的な手順を理解したうえで、PowerShellにおける変数や制御構文、関数など基礎的な構文の解説を行っていく。
スクリプトとはいっても、その実体はファイルとして保存されたコマンドの集合にすぎない。例えば前回も紹介した次のコードをスクリプト化するには、ただ単にこれをテキスト・エディタで入力し、ファイルとして保存すればよい。
Get-ChildItem | Format-List *
ここでは、スクリプトのファイル名を「Begin.ps1」としておこう。ファイルのベース名には任意の名前を指定できるが、PowerShellスクリプトの拡張子は「.ps1」としなければならない。
ただし拡張子を「.ps1」としたスクリプト・ファイルをエクスプローラなどからダブルクリックしてもPowerShellが自動起動するわけでは「ない」点には注意が必要である(試してみれば分かるように、「.ps1」ファイルはデフォルトでメモ帳によって開かれる)。
従来多くのスクリプティング実行環境では、スクリプト・ファイルをダブルクリックすれば自動的にコードを実行できたため、PowerShellのこの仕様は一見、不便であるように思われるかもしれない。しかし従来のこのような挙動は、往々にしてセキュリティ上の問題となることが多かった。つまりスパム・メールなどに添付されてきたスクリプト・ファイルをエンドユーザーがダブルクリックしてしまった場合、そのまま任意のコードが実行されてしまう可能性があった。しかしPowerShellではユーザーが「.ps1」ファイルをダブルクリックしても単にメモ帳が開くだけである。これにより、PowerShellから明示的にスクリプト・ファイルを呼び出さない限り、こうした悪意あるスクリプトが意図せずに実行される可能性を最小限に抑えることができる。
ではPowerShellスクリプトを実際に実行してみよう。繰り返しになるが、PowerShellでは「.ps1」ファイルのダブルクリックではスクリプトを起動することができないので、PowerShell上から明示的に呼び出す必要がある。ただしこの場合にも、従来のコマンド・プロンプトに慣れている方にとってはいくつか注意しなければならない点がある。
例えば先ほど作成した「Begin.ps1」をカレント・フォルダ(ここでは「C:\Windows\Temp」)に配置しているものと仮定する。その場合、従来のコマンド・プロンプトであれば、単にファイル名を指定するだけでスクリプト・ファイルが呼び出され、実行されるはずだ。これは、コマンド・プロンプトがコマンド・パスの検索先として、デフォルトでカレント・フォルダを含めているためだ。しかしPowerShellの場合はどうだろう。
PS > Begin.ps1
用語 'Begin.ps1' は、コマンドレット、関数、操作可能なプログラム、またはスクリプト ファイルとして認識されません。用語を確認し、再試行してください。
発生場所 行:1 文字:9
+ Begin.ps1<<<<
このように、エラーとなり、ファイル名が認識されていないことが確認できる。結論からいってしまうと、PowerShellではスクリプト・ファイルを実行する場合に必ず絶対パスか相対パス形式でファイルを指定しなければならない。つまり上の例であれば、
PS > ./Begin.ps1
または、
PS > C:\Windows\Temp\Begin.ps1
のように指定する必要がある(拡張子「.ps1」は省略しても構わない)。
もっとも、これだけではまだ「.ps1」ファイルを実行することはできない。絶対パス/相対パスを指定して再び実行してみると、先ほどとはまた異なるエラーメッセージに遭遇することになるはずだ。具体的なメッセージは以下のとおりである。
スクリプトの実行がシステムで無効になっているため、ファイル C:\...\Begin.ps1 を読み込めません。詳細については、「get-Help about_signing」と入力してヘルプを参照してください。
PowerShellではセキュリティ上の理由から、デフォルトでスクリプトの実行が無効に設定されている。そのため、スクリプト・ファイルを実行するためには、あらかじめPowerShellのスクリプト実行ポリシーを変更しておく必要がある。実行ポリシーを変更するにはSet-ExecutionPolicyコマンドレットを利用する。
PS > Set-ExecutionPolicy RemoteSigned
Set-ExecutionPolicyコマンドレットを実行してから再びスクリプト・ファイルを実行してみると、今度は確かにスクリプト・ファイルが呼び出され、正しく実行されることが確認できるはずだ。
PS > ./Begin.ps1
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\windows\tmp\Begin.ps1
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\windows\tmp
PSChildName : Begin.ps1
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
…(後略)…
Set-ExecutionPolicyコマンドレットで指定可能な実行ポリシーには以下のようなものがある。
実行ポリシー | 概要 |
---|---|
Restricted | すべてのスクリプトを実行不可 |
AllSigned | すべてのスクリプトに証明書を要求 |
RemoteSigned | インターネット経由でダウンロードしたスクリプトのみ証明書を要求 |
Unrestricted | すべてのスクリプト実行を許可(ただしインターネット経由でダウンロードしたコードは実行確認のみあり) |
PowerShellで利用可能な実行ポリシー |
通常、スクリプトを開発/実行する環境においては、実行ポリシーとして「RemoteSigned」を選択しておくことをお勧めする。「AllSigned」がより安全ではあるが、すべてのスクリプトに証明書が必要となるため、特に自分でスクリプトを開発するような局面では適切とはいえない。「Unrestricted」は名前のとおり、一切の制約を課さない実行ポリシーであり、すべてのスクリプトを無条件に実行することができる。通常、特別な理由がない限りはUnrestrictedの利用は避けるべきだ。
以上、PowerShellにおけるスクリプトの実行方法を理解したところで、ここからはPowerShellにおける基本的な構文について紹介していく。
Copyright© Digital Advantage Corp. All Rights Reserved.