Windows PowerShell のプログラミング


 [Home]  [Index] 投稿 2015/05/01


 

 

 

 コマンドライン引数

コマンドライン引数は、$Args という組み込み変数に格納されます。$Args は Object 型の配列 (つまり文字列以外も渡せる) で、スクリプト自身の名前は含まれません。下に $Args についてのサンプルを示します。

# コマンドライン引数を表示する。
$Args.GetType()
$Args.Length
$Args | ForEach-Object { Write-Output $_ }

実行例

PS C:\> .\Args.ps1 a bb ccc

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
3
a
bb
ccc

[Top]

 

 スコープ

スコープとは

PowerShell には「スコープ」という概念があります。スコープはPowerShell において、変数、エイリアス、関数にアクセス制限を行うためのメカニズムです。スコープのルールは下記の通りです。


スコープの種類

[Top]


継承

子供スコープは変数、エイリアス、関数を親から継承できない。Private でない限り親の項目は子供のスコープから参照できる。親のスコープを特定すれば変更も可能である。

特定のスコープの変数を取得するには Get-Variable コマンドレットを使用する。

PS C:\> get-variable -scope global

Name                           Value
----                           -----
$                              local
?                              True
^                              get-variable
args                           {}
  (以下略)

[Top]


スコープの修飾

スコープを修飾するには下の例のように行う。

$global:a = 0 .. 10
function private:fnc($x) {
  # todo
}

特定のスコープを明示して変数を定義するには New-Variable コマンドレットを使用する。

New-Variable -scope global -name a -value "A"

[Top]

 

 モジュール

概要

モジュールは PowerShell のコマンド(コマンドレット、関数、変数・・)を含むパッケージである。モジュールはこれらのコマンドをまとめて管理し他のユーザと共有するためのものである。

モジュールをインポートするには、Import-Module コマンドレットを使用するが、PowerShell 3.0 以上ではモジュールが自動的にロードされるようになった。

モジュールの関数は Export-ModuleMember を使って明示的に公開する必要がある。

Export-ModuleMember -Function * # すべてのメンバーを公開する。

[Top]


モジュールのインストール

モジュールを使うためにはインストールが必要になる。インストールは以下のように行う。

  1. ユーザディレクトリに New-Item コマンドレットを使ってモジュール用のディレクトリを作成する。
    New-Item -Type Directory -Path $home\Documents\WindowsPowerShell\Modules あるいは mkdir $home\Documents\WindowsPowerShell\Modules
  2. モジュール名と同じフォルダを上で作成したフォルダの下に作成する。
  3. その作成したフォルダにモジュールファイル (.psm1) をコピーする。

インストールされたモジュールは以下のコマンドで調べることができる。

Get-Module -ListAvailable

現在のセッションでインポートされたモジュール一覧は以下のコマンドで知ることができる。

Get-Module

Get-Command コマンドレットを使うと、あるモジュールで利用可能なコマンドを知ることができる。※ Import-Moduleが事前に実行されていること。

Get-Command -Module <:module name>

サンプル

次のサンプルはメッセージボックスを表示するモジュールである。ファイル名は "msgbox.psm1"、モジュール名は "MsgBox" とする。msgbox.psm1 の内容を下に示す。

#
#  メッセージボックス
#
add-type -AssemblyName System.Windows.Forms

function MsgBox {
  param($message, $title)
  [System.Windows.Forms.MessageBox]::Show($message, $title) > $null
}

function Confirm {
  param($message, $title)
  [System.Windows.Forms.MessageBox]::Show($message, $title, [System.Windows.Forms.MessageBoxButtons]::OKCancel)
}

function Question {
  param($message, $title)
  [System.Windows.Forms.MessageBox]::Show($message, $title, [System.Windows.Forms.MessageBoxButtons]::YesNo)
}

Export-ModuleMember -Function *  # すべてのメンバーを公開する。

[Top]


このソースファイルを "C:\Users\user\Documents\WindowsPowerShell\Modules" (PowerShellなら "$Home\Documents\WindowsPowerShell\Modules でもよい) というフォルダの下に "MsgBox" というフォルダを作りコピーする。もし、上位フォルダが存在しない場合は作成する。ここで "user" はユーザ名なので環境により異なる。

テストプログラム

import-module MsgBox
msgbox "Test module" "test"
confirm "テスト" "確認"
question "テスト" "質問"

実行例

PS C:\> .\msgbox_test.ps1
OK
Yes
   

[Top]


バイナリーモジュール

モジュールは C# などを使って DLL として作ることもできる。このようなモジュールの場合は、マニフェスト (*.psd1) により内部に含まれる内容を記述する。例えば、MyModule.dll というモジュールを作った場合、c:\windows\system32\windowspowershell\v1.0\modules\MyModule というフォルダにインストールし、MyModule.psd1 というマニフェストを同じフォルダに配置する。

 

 

ジョブ

PowerShell ではバックグランドジョブを実行する機能があります。これらに関連するコマンドレットを以下に示します。

コマンドレット 説明
Start-Job ローカルコンピュータのバックグランドジョブを開始する。
Get-Job 現在のセッションで開始されたジョブ一覧を得る。
Receive-Job バックグランドジョブの実行結果を受信する。
Stop-Job ジョブを停止する。
Wait-Job ジョブが終了するまでコマンドプロンプトを抑止する。
Remove-Job ジョブを削除する。
Invoke-Command AsJob パラメータはリモートコンピュータでコマンドをバックグランドジョブとして実行する。リモートコンピュータでの Start-Job コマンドレットの代用として使用する。

[Top]