【PowerShell講座】引数を受け取る

引数を受け取る

※この記事は「2020年2月6日」に更新しました。

PowerShell講座です。

前回は、関数について紹介しました。

【PowerShell講座】関数について

2020.01.31

今回は、もう少し関数やスクリプトを便利に使うために引数を受け取る方法を紹介していきます。

環境は、Windows 10(64bit)、PowerShell 6.1.2 です。

それでは見ていきましょう。



引数を受け取る

引数を受け取る方法です。

引数は $Args に格納される

まずは、サンプルからご覧下さい。

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

こちらを test.ps1 として保存し、パラメータを与えて、実行してみます。

すると以下のようになります。

引数を受け取る

こんな感じで引数は $Args という配列に自動的に格納されます。

ちなみに Write-Host は、ホスト(この場合、PowerShellコンソール)に出力するものと思って下さい。

引数を定義する

引数を定義するには、Param を使います。

Param($Args1,$Args2)

Param で定義している変数は、オプションとして使うことができます。

.\test.ps1 -Args2 100 -Args1 50

ちなみに型指定もできます。

Param([Int]$Args1,[Int]$Args2)

Int は、整数型です。

これで例えば、test など文字列を渡すとエラーが返ります。

また、引数に初期値を格納することもできます。

Param(
[Int]$Args1 = 50,
[Int]$Args2 = 100
)

長くなったので、改行しましたが、このように改行しても問題ありません。

引数を受け取るサンプルスクリプト

それでは、引数を受け取るサンプルを紹介します。

以前、Excel と PowerShell を組合わせて、複数フォルダを高速で作成するスクリプトを紹介したかと思います。

【PowerShell講座】複数フォルダを高速で作成する

2020.01.12

これを今回学習した内容を踏まえて、スクリプトを変更してみます。

以下のコードを test.ps1 として保存します。

Param(
[Int]$date1 = 20200101,
[Int]$date2 = 20200131
)

if($date2-$date1 -ge 31){
  Write-Host '入力値が不正なので処理を中断します。'
  exit
}

while($date1 -le $date2) {
  New-Item $date1 -ItemType Directory
  $date1++
}

入力ミスで大量のフォルダが作成されないように、二つの引数の差が 31以上になる場合、処理を中断するようにしています。

これを引数なしで実行すると 20200101~20200131 まで、31個のフォルダが高速で作成されます。

続いて以下のように実行してみましょう。

.\test.ps1 -date1 20200201 -date2 20200229

すると結果は以下のようになります。

引数を受け取る

20200201~20200229 まで、29個のフォルダが高速で作成されました。

最後に

いかがでしょうか。

最後に紹介したものは、まだ改良の余地があります。

入力する範囲が必要以上に広いからです(自分で使う分には問題ないでしょうが)。

日付(8桁)を入力しているのに Int型としているのも違和感があります。

下2桁しか計算しないから問題ないわけです。

しかし、引数の受け取りができると可能性が広がります。

色々試してみると面白いと思います。