スクリプトファイルの作成
PowerShellにおけるスクリプトファイルは、拡張子が「.ps1」のテキストファイルです。テキストファイルなので、メモ帳などのテキストエディタで作成することが可能です。
では、先ほどのコードをテキストエディタで入力し、「sample1.ps1」と名前を付けて保存しましょう(可能であれば「C:\Work」というフォルダを作成し、ここへ保存してください。以降このフォルダを使用して説明します。任意のフォルダへ保存する場合は適宜読み替えてください)。
if ( Test-Path “Test.txt” )
{
Write-Host "Test.txtは存在します"
}
else
{
Write-Host "Test.txtは存在しません"
}
スクリプトファイルの実行とセキュリティ
従来のスクリプティング環境のほとんどは、作成したスクリプトファイルをダブルクリックで実行することができました。しかしPowerShellでは、ダブルクリックでは実行されないように設計されています。これは簡単に実行できることで悪意のあるスクリプトファイルから身を守ることができるようへの配慮からです。
ためしに「sample1.ps1」をダブルクリックしてみてください。メモ帳で「sample1.ps1」が開かれるのではないでしょうか? スクリプトに使用される「.ps1」という拡張子がPowerShellに関連づけられていないため、このような動作になります。
PowerShellでは、スクリプトファイルは明示的に実行する必要があります。
まずはコンソールウィンドウで、
cd C:\Work
と入力し、ディレクトリを移動します。次に、
sample1.ps1
と入力し[Enter]キーを押してみてください。
まだエラーが発生してしまいます。このように実際にはスクリプトファイル名を入力するだけでは不十分です。PowerShellでは、スクリプトファイルの実行は絶対パスで指定するか、カレントディレクトリのファイルの場合は先頭に./を付けて実行します。
では、なぜこんな面倒くさいことをしなければならないのでしょうか? 実はスクリプトの実行は拡張子を省略して入力できるのですが、拡張子を省略すると、既存のコマンドレットと同名のファイル名を付けた場合には、自作のスクリプトと既存のコマンドレットの区別ができなくなってしまいます。これはコマンドの乗っ取りと呼ばれます。
例えば「Get-Command.ps1」という名前のファイルがあったとします。これを、
Get-Command[Enter]
で実行可能だとしたらどうでしょう?
既存のGet-Commandコマンドレットとの区別がつかなくなりますし、ましてやこのスクリプトがファイルを勝手に削除してしまうようなスクリプトだとしたら大変です。
このような背景から、PowerShellでのスクリプト実行は絶対パス、またはカレントディレクトリのファイルの先頭に./を付けて実行する仕組みとなっています。
これで、スクリプトの実行方法についてはわかりました。しかし、このままでは実行できません。PowerShellは、既定ではスクリプトの実行が許されていないからです。
コンソールウィンドウに、
Get-ExecutionPolicy
と入力し[Enter]キーを押してください。Restrictedと返ってきたのではないでしょうか? このコマンドレットは現在の実行ポリシーの設定を確認することができます。
実行ポリシーには以下の4つがあります。
| 実行ポリシー | 説明 |
| Restricted | すべてスクリプトの実行を禁止 |
| AllSigned | すべてのスクリプトに証明書を要求 |
| RemoteSigned | インターネットからダウロードしたスクリプトに証明書を要求 |
| Unrestricted | すべてのスクリプトの実行を許可 |
現段階では、自分のPCにあるスクリプトファイルが実行できれば良いので、実行ポリシーをRemoteSignedに設定しましょう。Set-ExecutionPolicyコマンドレットで実行ポリシーを変更することができます(OSがWindows Vistaの方は、Windows PowerShellを管理者として実行していないとこのコマンドレットを使用することができないので注意してください)。
Set-ExecutionPolicy RemoteSigned
と入力し[Enter]キーを押してください。これでやっとスクリプトファイルを実行できるようになりました。
では、「sample.ps1」を実行してみましょう。コンソールウィンドウで、
./sample1.ps1
と入力し[Enter]キーを押してください。
「C:\WorkにTest.txt」が存在すれば「Test.txtは存在します」を、存在しなければ「Test.txtは存在しません」と表示されるはずです(Test.txtを作成したり、削除したりして動作を確認してみてください)。


