Home > Windows にまつわる e.t.c.

PowerShell スクリプト引数(Param)の Tips


PowerShell の良い所は、コマンドレットやオプションが強力に TAB 補完されるところです。

この補完が強力なので、コマンドレットスペルとかオプションを細かく覚えていなくても簡単に PowerShell を使うことができます。

特にオプションの補完は強力で、「ハイフン」に続いて TAB 入力するだけでコマンドレットで指定可能なオプションが次々と表示されます。

これを自作スクリプトで実現する方法を紹介します。

 

Param の使い方

本題に入る前に PowerShell スクリプトの引数を定義する Param の使い方を説明をしましょう。

Param の一番簡単な書き方はこんな感じです。(test.ps1 を書いている想定)

Param( $aaa, $bbb )

echo "aaa: $aaa"
echo "bbb: $bbb"

 

この例では、2つの引数を受け取ります。

PS C:\work> .\test.ps1 "aaaa" 123
aaa: aaaa
bbb: 123
PS C:\work>

 

Param で定義している変数名はオプションとして指定できますので、- で指定できますし TAB 補完もできます。

PS C:\work> .\test.ps1 -bbb "zzzzz" -aaa 987654
aaa: 987654
bbb: zzzzz
PS C:\work>

 

PowerShell で変数の型指定ができるように、Param でも型指定ができます。

Param( [string]$aaa, [int]$bbb )

 

配列を受け取りたいときは [array] が使えます。値が配列ではない時も配列として扱われます。

Param( [array]$ccc )

$ccc[0]
$ccc.Length
$ccc.GetType()

 

PS C:\work> .\test.ps1 "abc"
abc
1

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

 

Param は色々な書き方が出るので、自分好みの書き方を見つけてください。

僕はこんな感じの書き方をしています。

Param(
    [string]$Name,  # 名前
    [int32]$Index   # 数値
    )

 

 

オプション値の補完

オプションは Param の変数名ですが、オプション値は ValidateSet で定義すると補完できるようになります。
(PowerShell 4.0 以降)

Param(
    [ValidateSet("aaa" , "bbb", "ccc")]$abc,
    [ValidateSet("DDD" , "EEE", "FFF")]$def
    )

echo "abc : $abc"
echo "def : $def"

 

PS C:\work> .\test.ps1 -def FFF -abc bbb
abc : bbb
def : FFF
PS C:\work>

 

オプション指定しなくても、引数順番にオプション値の候補を表示させることができます。

PS C:\work> .\test.ps1 bbb FFF
abc : bbb
def : FFF
PS C:\work>

 

 

boolean オプション

bool 値のオプションを作る場合、値に $true/$false を指定しても良いのですが、switch 指定すると bool 値のオプションが作れます。

Param(
    [switch]$aaa,
    [switch]$bbb
    )

echo "aaa : $aaa"
echo "bbb : $bbb"

 

PS C:\work> .\test.ps1 -bbb
aaa : False
bbb : True
PS C:\work>

 

 

必須オプション

必須オプションにする場合は、[parameter(mandatory=$true)] を指定します。
(PS3 以降であれば =$true を省略可能)

param (
        [parameter(mandatory=$true)][string]$InputString
    )

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.