見出し画像

PowerShell スクリプトの引数

PowerShellで引数を使用する方法をまとめました。


引数を受け取る

PowerShell スクリプトでは引数は $Args[] に格納される

まずc:\tempフォルダにtest.ps1というスクリプトファイルを作ります。
スクリプトファイルがこのようになっていた場合

Write-Host $Args[0]
Write-Host $Args[1]

実行して引数を渡すと

C:\temp\>.\test.ps1 "apple" "banana"
apple
banana

第一引数は $Args[0]、第二引数は $Args[1] ...といった形で受け取れます。


引数を宣言する手法

引数を宣言しておくことでスクリプト実行時に受け取るの変数を指定することができます。Param属性で設定します。

スクリプトファイルがこのようになっていた場合

Param($aaa,$bbb) #第一引数を $aaaa,第二引数を$bbbbに格納する
Write-Host $aaa
Write-Host $bbb

引数を渡すと

C:\temp\>.\test.ps1 "apple" "banana"
apple
banana


実行時に受け取る引数を指定することもできます。

C:\temp\>.\test.ps1 -bbb "apple" -aaa "banana"
banana
apple
# この例ではaaaに"banana"、bbbに"apple"が渡されていて順番が入れ替わっていることが分かります。


引数に初期値をセットする

スクリプトファイルがこのようになっていた場合

Param(
  $aaa="apple",
  $bbb="banana"
)
Write-Host $aaa
Write-Host $bbb


引数なしで実行すると初期値になります

C:\temp\>.\test.ps1
apple
banana


引数に型を設定する

スクリプトファイルがこのようになっていた場合

Param(
  [String]$aaa,
  [int]$bbb
) 
Write-Host $aaa
Write-Host $bbb

実行すると

C:\temp\>.\test.ps1 banana 200
banana
200

正確には型を設定しているのではなく引数をキャストしているだけです。

こちらは正常系

C:\temp\>.\test.ps1 banana "1"
banana
1

第2引数を"1"から"gorila”に変えると、キャストに失敗してエラーになります。

C:\temp\>.\test.ps1 banana gorila
C:\temp\test.ps1 : パラメーター 'bbb' の引数変換を処理できません。値 "aaa" を型 "System.Int32" に変換できません。エ
ラー: "入力文字列の形式が正しくありません。"
発生場所 行:1 文字:19
+ .\test.ps1 banana gorila
+ ~~~
 + CategoryInfo : InvalidData: (:) [test.ps1]、ParameterBindingArgumentTransformationException
 + FullyQualifiedErrorId : ParameterArgumentTransformationError,test.ps1


引数を必須にする

特定の引数を必須にすることができます。
Parameter 属性を使います。

Param(
  [parameter(mandatory=$True)][String]$aaa,
  [parameter(mandatory=$False)][int]$bbb=500
) 
Write-Host $aaa
Write-Host $bbb

必須の引数を指定しなかった場合は指定するようにメッセージが表示されます

C:\temp\>.\test.ps1 -bbb 100 

コマンド パイプライン位置 1 のコマンドレット test.ps1
次のパラメーターに値を指定してください:
aaa:


特定の値以外受け付けない

Validate 属性を設定すると指定した値以外受け付けないようにできます。

Param(
  [ValidateSet("apple","banana","gorila")][String]$aaa,
  [ValidateSet(100,300,500,1000)][int]$bbb
) 
Write-Host $aaa
Write-Host $bbb


「引数必須」と「特定の値以外受け付けない」を組み合わせることもできます


Param(
  [parameter(mandatory=$true)][ValidateSet("apple","banana","gorila")][String]$aaa,
  [ValidateSet(100,300,500,1000)][int]$bbb
) 
Write-Host $aaa
Write-Host $bbb


環境変数やコマンドレットを初期値にできます

Param(
  [String]$aaa = [Net.Dns]::GetHostAddresses('').IPAddressToString[1], #IPアドレスを初期値に設定
  [String]$bbb = (Get-Date).toString("yyyy/MM/dd") #現在日付を初期値に設定
)
Write-Host $aaa
Write-Host $bbb



exe化と組み合わせるととても有効です


#PowerShell #コマンドレット #毎日更新

この記事が気に入ったらサポートをしてみませんか?