PowerShellでシェルスクリプトを実行できるようにする

 PowerShellもシェルスクリプトを実行することができます。bash,zshなどと同様にコマンドを羅列するだけでも動作します。ここでは以下の簡単なスクリプトを作成します。テキストエディタでもPowerShellの開発環境でも構いません。作成したらp1.ps1というファイル名で保存します。保存したらPowerShellから./p1.ps1と入力して実行してみましょう。多くの場合、実行できずエラーで停止してしまいます。

Write-Output 'PowerShellテスト'

PowerShellでシェルスクリプトを動作させるには設定が必要です。Mac版は設定せずともPowerShellのシェルスクリプトを動作させることができますが、Windows版はセキュリティの関係でデフォルトではシェルスクリプトを実行できないようになっています。

 シェルスクリプトの実行可能状況を調べるには以下のコマンドを入力します。 

Get-ExecutionPolicy

Windowsでデフォルトの場合、Restrictedが表示されます。

Restricted すべてのスクリプトは実行不可
AllSigned 署名付きのローカルにあるスクリプトは実行可能
RemoteSigned ローカルにあるスクリプトはすべて実行可能。ローカル以外では署名付きは実行可能
Unrestricted ローカルにあるスクリプトはすべて実行可能。ローカル以外は実行に許可が必要
Bypass すべてのスクリプトが実行可能

 ここではPowerShellスクリプトを実行できるようにポリシーを変更します。以下のように入力します。なお、ポリシーは現在のユーザーのみの変更になります。
 PowerShellでSet-ExecutionPolicy -Scope CurrentUserと入力するとポリシーを入力するように促されます。Unrestrictedと入力します。

Set-ExecutionPolicy -Scope CurrentUser

すると確認のメッセージが表示されるのでYの文字を入力しリターンキーを押します。(Yは大文字小文字は問いません)

これでポリシーが変更されたのでシェルスクリプトが動作するはずです。これで先ほどのスクリプトを実行できます。

PowerShellでのパラメーター処理

 次にシェルスクリプトに渡されたパラメーターの処理です。まずは、渡されたパラメーターを表示してみます。PowerShellでは渡されたパラメーターは$Args[0]$Args[1]のように参照することができます。bashの$1が$Args[0]に該当します。$2なら$Args[1]といった具合になります。[ ]内の数値によって任意の位置のパラメーターを参照できるわけです。
 以下のようなシェルスクリプトを作成し実行すると渡された最初のパラメーターが表示されます。

Write-Output $Args[0]

$Args[]で指定する以外にparam()を使う方法もあります。param()の中に変数を書くと、書かれた順番でパラメーターが格納されます。以下のようにすると最初に渡されたパラメーターの内容が表示されます。これは先ほどのスクリプトと同じ動作・結果になります。

param($shopStatus)
Write-Output $shopStatus

パラメーターが必須の場合は変数名の前に[parameter(mandatory=$true)]を指定します。これでパラメーターが指定されていない場合、メッセージが表示されパラメーターを入力するように促されます。

param([parameter(mandatory=$true)]$shopStatus)
Write-Output $shopStatus

パラメーターが必須ではなく、デフォルト値を設定する場合はparam()内に変数名を書く際に=を使って代入しておきます。

param($shopStatus='営業中')
Write-Output $shopStatus

 ここまでできれば前回と同じように目的のファイル内容を変更して処理することができます。

param($shopStatus='営業中')
Get-Content infotemp.txt | foreach { $_ -replace 'INFO',$shopStatus } > info.txt

簡単な内容の置き換えならシェルスクリプトでも十分使えます。ただ、複雑な内容の書き換えがある場合はプログラム言語を使った方がスマートにできるかなと思います。まあ、状況に応じてうまく使い分けるのがよいでしょう。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。