PowerShellでコマンドライン引数をマスターする

PowerShellは、システム管理と自動化において強力なツールです。

その柔軟性とスクリプト言語としての能力は、日々のタスクを効率的に行うための強力な味方となります。

この記事では、PowerShellでコマンドライン引数を使用する方法について詳しく解説します。

これにより、スクリプトをよりダイナミックで再利用可能なものにすることができます。

コマンドライン引数とは?

コマンドライン引数とは、スクリプトやプログラムを実行する際に渡されるパラメータのことです。

これらの引数を使用することで、スクリプトの動作を実行時にカスタマイズすることができます。

たとえば、特定のファイルパスや設定値を引数として渡すことで、同じスクリプトを異なる状況で再利用することが可能です。

PowerShellでの基本的なコマンドライン引数の使用

PowerShellスクリプトにコマンドライン引数を渡す基本的な方法は、スクリプトファイル名の後に引数をスペースで区切って指定することです。

以下の例では、example.ps1というスクリプトに引数を渡しています。

.\example.ps1 "argument1" "argument2"

スクリプト内でこれらの引数を受け取るには、特殊な変数 $args を使用します。

この変数は配列として扱われ、引数は0から始まるインデックスでアクセスできます。

# example.ps1
$arg1 = $args[0]
$arg2 = $args[1]

Write-Output "Argument 1: $arg1"
Write-Output "Argument 2: $arg2"

このスクリプトを実行すると、次のような出力が得られます。

# 出力結果
Argument 1: argument1
Argument 2: argument2

高度な引数の管理

PowerShellでは、より柔軟で明示的な引数の管理が可能です。

param ブロックを使用すると、引数のデフォルト値を設定したり、型を指定したりすることができます。

以下に例を示します。

# example.ps1
param (
    [string]$FirstName,
    [string]$LastName,
    [int]$Age
)

Write-Output "Name: $FirstName $LastName"
Write-Output "Age: $Age"

このスクリプトを実行するには、次のように引数を指定します。

.\example.ps1 -FirstName "John" -LastName "Doe" -Age 30

これにより、次の出力が得られます。

# 出力結果
Name: John Doe
Age: 30

デフォルト値とオプショナル引数

引数にデフォルト値を設定することで、スクリプトの実行がより柔軟になります。

デフォルト値を設定すると、引数が指定されなかった場合にその値が使用されます。

# example.ps1
param (
    [string]$FirstName = "John",
    [string]$LastName = "Doe",
    [int]$Age = 25
)

Write-Output "Name: $FirstName $LastName"
Write-Output "Age: $Age"

引数を省略してスクリプトを実行すると、デフォルト値が適用されます。

.\example.ps1 -FirstName "Jane"

出力は次のようになります。

# 出力結果
Name: Jane Doe
Age: 25

スクリプトブロックと引数の組み合わせ

PowerShellでは、スクリプトブロックを引数として渡すこともできます。

これにより、動的な処理をスクリプト内で実行することが可能になります。

以下は、スクリプトブロックを引数として受け取る例です。

# example.ps1
param (
    [scriptblock]$Script
)

&$Script

このスクリプトを実行する際には、スクリプトブロックを次のように渡します。

.\example.ps1 -Script { Write-Output "Hello from script block" }

出力は次のようになります。

# 出力結果
Hello from script block

エラーハンドリング

PowerShellでは、引数の検証やエラーハンドリングを組み込むことができます。

これにより、スクリプトの信頼性が向上します。

以下に、引数の値を検証する例を示します。

# example.ps1
param (
    [int]$Age
)

if ($Age -lt 0 -or $Age -gt 120) {
    Write-Error "Age must be between 0 and 120."
    exit
}

Write-Output "Age: $Age"

このスクリプトを実行する際に不正な引数を渡すと、エラーメッセージが表示され、スクリプトが終了します。

.\example.ps1 -Age 150

出力は次のようになります。

# 出力結果
Age must be between 0 and 120.

引数の順序と名前付き引数

PowerShellでは、引数を位置指定(ポジショナル)引数として渡すこともできますが、名前付き引数を使用する方が一般的です。

名前付き引数を使用すると、引数の順序に依存せずにスクリプトを実行できます。

# example.ps1
param (
    [string]$FirstName,
    [string]$LastName
)

Write-Output "Name: $FirstName $LastName"

このスクリプトは、次のいずれの方法でも実行できます。

.\example.ps1 -FirstName "John" -LastName "Doe"
.\example.ps1 -LastName "Doe" -FirstName "John"

どちらの方法でも、出力は同じです。

# 出力結果
Name: John Doe

実践例:ファイルの検索スクリプト

最後に、コマンドライン引数を使用した実践的な例として、指定されたディレクトリ内のファイルを検索するスクリプトを作成します。

# .\search.ps1
param (
    [string]$Directory,
    [string]$Pattern
)

if (-not (Test-Path $Directory)) {
    Write-Error "Directory does not exist."
    exit
}

$files = Get-ChildItem -Path $Directory -Filter $Pattern -Recurse
if ($files.Count -eq 0) {
    Write-Output "No files found matching pattern '$Pattern' in directory '$Directory'."
} else {
    foreach ($file in $files) {
        Write-Output $file.FullName
    }
}

このスクリプトを実行する際には、検索するディレクトリとファイルのパターンを指定します。

.\search.ps1 -Directory "C:\Users\Public\Documents" -Pattern "*.txt"

指定されたディレクトリ内のすべてのテキストファイルがリストされます。

まとめ

PowerShellでコマンドライン引数を使用することで、スクリプトをより柔軟で再利用可能なものにすることができます。

基本的な使い方から高度な管理方法まで、さまざまなテクニックを駆使して、スクリプトの汎用性を高めましょう。

これにより、日常のタスクを効率的に自動化し、作業の生産性を向上させることができます。