【PowerShell入門】関数の基本と一覧取得方法|初心者でもわかる完全ガイド

Windows

PowerShellを使い始めたばかりの方は、「関数って何?」「どうやって作るの?」「今どんな関数が使えるの?」と疑問に思うかもしれません。

関数とは、簡単に言うと「よく使う処理をひとまとめにして、簡単に呼び出せるようにしたもの」です。

料理で例えるなら、「カレーの作り方」をレシピとして書いておいて、いつでも同じ手順でカレーを作れるようにするイメージです。

この記事では、PowerShellの関数について、「プログラミングは初めて」という方でもわかるように、基本から応用まで丁寧に説明します。

実際に動かせるコードもたくさん載せているので、一緒に試しながら覚えていきましょう!

スポンサーリンク

PowerShellの関数って何?

関数をわかりやすく説明すると

関数とは、「決まった処理をまとめて名前をつけたもの」です。

一度作っておけば、その名前を呼ぶだけで同じ処理を何度でも実行できます。

身近な例で考えてみましょう

  • 電子レンジの「温めボタン」→ 複雑な温度調整を1つのボタンで実行
  • スマホの「写真アプリ」→ 撮影から保存までの処理をアプリ名で呼び出し
  • 関数→ 複雑な処理を簡単な名前で呼び出し

関数を使うメリット

1. 同じコードを何度も書かなくて済む 毎回長いコードを書く代わりに、関数名を呼ぶだけで処理を実行できます。

2. コードが読みやすくなる 複雑な処理に分かりやすい名前をつけることで、何をしているかが一目でわかります。

3. 間違いが減る 一度正しく動く関数を作れば、同じ処理で毎回同じ結果が得られます。

4. 修正が楽になる 処理を変更したいときは、関数の中身だけを修正すれば、その関数を使っている全ての場所に反映されます。

PowerShellでの関数の基本構文

function 関数名 {
    # ここに実行したい処理を書く
}

コードの説明

  • function:「これから関数を作りますよ」という合図
  • 関数名:あなたが決める関数の名前
  • { }:この中に実際の処理を書く

実際に関数を作ってみよう

function Say-Hello {
    Write-Output "こんにちは、PowerShell!"
}

# 関数を呼び出してみる
Say-Hello

実行結果

こんにちは、PowerShell!

コードの解説

  1. Say-Hello という名前の関数を作成
  2. 関数の中身は「こんにちは、PowerShell!」と表示する処理
  3. Say-Hello と入力すると関数が実行される

この簡単な例でも、関数の基本的な仕組みがわかりますね。

現在使える関数の一覧を確認する方法

なぜ関数の一覧を確認するの?

PowerShellには最初から便利な関数がたくさん用意されています。

また、自分で作った関数もセッション中は使い続けることができます。どんな関数が使えるかを知ることで、作業効率がぐっと上がります。

方法1:Function:ドライブを使う

Get-ChildItem Function:

実行すると: 現在のセッションで利用できる全ての関数が一覧で表示されます。

表示例

Name                           CommandType
----                           -----------
A:                             Function
B:                             Function
C:                             Function
Clear-Host                     Function
...(たくさんの関数が表示される)

方法2:Get-Commandを使う

Get-Command -CommandType Function

こちらも同じように関数の一覧が表示されますが、より詳細な情報を含んでいます。

自分で作った関数だけを確認する

多くの関数が表示されて見つけにくい場合は、名前で絞り込むことができます:

# 「Say」で始まる関数だけを表示
Get-ChildItem Function: | Where-Object { $_.Name -like "Say*" }

# 自分で作った関数の名前を覚えている場合
Get-Command Say-Hello

関数の詳細情報を確認する

特定の関数について詳しく知りたい場合:

Get-Command Say-Hello | Format-List *

表示される情報

  • 関数の定義
  • パラメーター情報
  • 作成された場所
  • その他の詳細

関数の一覧を確認できるようになったら、次はもっと実用的な関数の作り方を学んでみましょう。

パラメーター付き関数を作ってみよう

パラメーターって何?

パラメーターとは、関数に渡す「材料」のようなものです。同じ関数でも、渡す材料によって結果が変わります。

身近な例

  • 計算機の「足し算機能」→ 数字(パラメーター)を渡すと計算結果が返ってくる
  • 翻訳アプリ→ 日本語(パラメーター)を渡すと英語が返ってくる

基本的なパラメーター付き関数

function Greet {
    param($Name)
    Write-Output "こんにちは、$Name さん!"
}

# 使い方
Greet -Name "太郎"
Greet -Name "花子"

実行結果

こんにちは、太郎 さん!
こんにちは、花子 さん!

コードの解説

  • param($Name):「$Name というパラメーターを受け取ります」という意味
  • $Name:パラメーターとして渡された値が入る箱
  • -Name "太郎":Name というパラメーターに「太郎」を渡す

複数のパラメーターを使う関数

function Calculate-Sum {
    param($Number1, $Number2)
    $result = $Number1 + $Number2
    Write-Output "$Number1 + $Number2 = $result"
}

# 使い方
Calculate-Sum -Number1 5 -Number2 3
Calculate-Sum -Number1 10 -Number2 7

実行結果

5 + 3 = 8
10 + 7 = 17

デフォルト値を設定した関数

パラメーターに何も渡されなかった場合の初期値を設定できます:

function Greet-WithDefault {
    param($Name = "ゲスト")
    Write-Output "こんにちは、$Name さん!"
}

# パラメーターありで実行
Greet-WithDefault -Name "田中"

# パラメーターなしで実行(デフォルト値が使われる)
Greet-WithDefault

実行結果

こんにちは、田中 さん!
こんにちは、ゲスト さん!

実用的な関数の例

function Show-FileInfo {
    param($FilePath)
    
    if (Test-Path $FilePath) {
        $file = Get-Item $FilePath
        Write-Output "ファイル名: $($file.Name)"
        Write-Output "サイズ: $($file.Length) バイト"
        Write-Output "作成日: $($file.CreationTime)"
        Write-Output "最終更新: $($file.LastWriteTime)"
    } else {
        Write-Output "ファイルが見つかりません: $FilePath"
    }
}

# 使い方(実際のファイルパスを指定してください)
Show-FileInfo -FilePath "C:\Windows\notepad.exe"

パラメーターを使えるようになると、関数の可能性が大きく広がります。次は、さらに高度な機能を見ていきましょう。

高度な関数機能を使ってみよう

パイプライン処理対応の関数

PowerShellの特徴の一つは「パイプライン」です。前のコマンドの結果を次のコマンドに渡すことができます。関数もパイプラインに対応させることができます。

function Show-Items {
    process {
        Write-Output "アイテム: $_"
    }
}

# 使い方
"りんご", "バナナ", "みかん" | Show-Items

実行結果

アイテム: りんご
アイテム: バナナ
アイテム: みかん

コードの解説

  • process { }:パイプラインで渡されたデータを1つずつ処理する
  • $_:現在処理中のデータを表す特別な変数

より実用的なパイプライン関数

function Add-Prefix {
    param($Prefix = "【重要】")
    process {
        Write-Output "$Prefix $_"
    }
}

# 使い方
"会議のお知らせ", "システムメンテナンス", "締切のご連絡" | Add-Prefix
"新商品リリース", "価格改定" | Add-Prefix -Prefix "【お知らせ】"

実行結果

【重要】 会議のお知らせ
【重要】 システムメンテナンス
【重要】 締切のご連絡
【お知らせ】 新商品リリース
【お知らせ】 価格改定

エラー処理を含む関数

実際の業務では、エラーが起きることを想定した関数を作ることが大切です:

function Divide-Numbers {
    param($Number1, $Number2)
    
    try {
        if ($Number2 -eq 0) {
            throw "0で割ることはできません"
        }
        $result = $Number1 / $Number2
        Write-Output "$Number1 ÷ $Number2 = $result"
    }
    catch {
        Write-Error "エラーが発生しました: $_"
    }
}

# 正常なケース
Divide-Numbers -Number1 10 -Number2 2

# エラーケース
Divide-Numbers -Number1 10 -Number2 0

実行結果

10 ÷ 2 = 5
エラーが発生しました: 0で割ることはできません

ファイル処理を行う実用的な関数

function Backup-Files {
    param(
        $SourcePath,
        $BackupPath = "C:\Backup"
    )
    
    try {
        # バックアップ先フォルダが存在しない場合は作成
        if (-not (Test-Path $BackupPath)) {
            New-Item -ItemType Directory -Path $BackupPath -Force
            Write-Output "バックアップフォルダを作成しました: $BackupPath"
        }
        
        # ファイルをコピー
        $timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
        $fileName = (Get-Item $SourcePath).Name
        $backupFileName = "${timestamp}_$fileName"
        $backupFullPath = Join-Path $BackupPath $backupFileName
        
        Copy-Item $SourcePath $backupFullPath
        Write-Output "バックアップ完了: $backupFullPath"
    }
    catch {
        Write-Error "バックアップに失敗しました: $_"
    }
}

# 使い方
Backup-Files -SourcePath "C:\重要なファイル.txt"

begin、process、endブロックを使った高度な関数

大量のデータを効率的に処理する場合に使います:

function Count-Items {
    begin {
        $count = 0
        Write-Output "処理を開始します..."
    }
    process {
        $count++
        Write-Output "処理中: $_ (累計: $count 件)"
    }
    end {
        Write-Output "処理完了。合計 $count 件のアイテムを処理しました。"
    }
}

# 使い方
1..5 | Count-Items

実行結果

処理を開始します...
処理中: 1 (累計: 1 件)
処理中: 2 (累計: 2 件)
処理中: 3 (累計: 3 件)
処理中: 4 (累計: 4 件)
処理中: 5 (累計: 5 件)
処理完了。合計 5 件のアイテムを処理しました。

これらの高度な機能を使えるようになると、PowerShellでより複雑で実用的な処理を自動化できるようになります。

実際の業務で使える関数例

システム情報を表示する関数

function Show-SystemInfo {
    Write-Output "=== システム情報 ==="
    Write-Output "コンピューター名: $env:COMPUTERNAME"
    Write-Output "ユーザー名: $env:USERNAME"
    Write-Output "OS: $((Get-WmiObject Win32_OperatingSystem).Caption)"
    Write-Output "PowerShellバージョン: $($PSVersionTable.PSVersion)"
    
    $memory = Get-WmiObject Win32_PhysicalMemory | Measure-Object Capacity -Sum
    $memoryGB = [math]::Round($memory.Sum / 1GB, 2)
    Write-Output "メモリ: ${memoryGB}GB"
    
    $disk = Get-WmiObject Win32_LogicalDisk | Where-Object { $_.DriveType -eq 3 }
    foreach ($drive in $disk) {
        $freeSpaceGB = [math]::Round($drive.FreeSpace / 1GB, 2)
        $totalSpaceGB = [math]::Round($drive.Size / 1GB, 2)
        Write-Output "ドライブ$($drive.DeviceID) ${freeSpaceGB}GB / ${totalSpaceGB}GB 利用可能"
    }
    Write-Output "===================="
}

Show-SystemInfo

ログファイルを分析する関数

function Analyze-LogFile {
    param($LogPath)
    
    if (-not (Test-Path $LogPath)) {
        Write-Error "ログファイルが見つかりません: $LogPath"
        return
    }
    
    $content = Get-Content $LogPath
    $totalLines = $content.Count
    $errorLines = $content | Where-Object { $_ -match "ERROR" }
    $warningLines = $content | Where-Object { $_ -match "WARNING" }
    
    Write-Output "=== ログ分析結果 ==="
    Write-Output "ファイル: $LogPath"
    Write-Output "総行数: $totalLines"
    Write-Output "エラー: $($errorLines.Count) 件"
    Write-Output "警告: $($warningLines.Count) 件"
    
    if ($errorLines.Count -gt 0) {
        Write-Output ""
        Write-Output "最新のエラー(最大5件):"
        $errorLines | Select-Object -Last 5 | ForEach-Object {
            Write-Output "  $_"
        }
    }
    Write-Output "==================="
}

# 使い方
# Analyze-LogFile -LogPath "C:\Logs\application.log"

ファイル整理を行う関数

function Organize-FilesByDate {
    param(
        $SourcePath,
        $DestinationPath
    )
    
    if (-not (Test-Path $SourcePath)) {
        Write-Error "ソースパスが見つかりません: $SourcePath"
        return
    }
    
    $files = Get-ChildItem $SourcePath -File
    
    foreach ($file in $files) {
        $year = $file.CreationTime.Year
        $month = $file.CreationTime.ToString("MM")
        $yearMonthPath = Join-Path $DestinationPath "$year\$month"
        
        if (-not (Test-Path $yearMonthPath)) {
            New-Item -ItemType Directory -Path $yearMonthPath -Force | Out-Null
            Write-Output "フォルダを作成: $yearMonthPath"
        }
        
        $destinationFile = Join-Path $yearMonthPath $file.Name
        Move-Item $file.FullName $destinationFile
        Write-Output "移動: $($file.Name) → $yearMonthPath"
    }
    
    Write-Output "ファイル整理が完了しました。"
}

# 使い方
# Organize-FilesByDate -SourcePath "C:\Downloads" -DestinationPath "C:\OrganizedFiles"

ネットワーク接続をテストする関数

function Test-NetworkConnections {
    param(
        $Servers = @("google.com", "microsoft.com", "github.com")
    )
    
    Write-Output "=== ネットワーク接続テスト ==="
    
    foreach ($server in $Servers) {
        try {
            $result = Test-Connection $server -Count 1 -Quiet
            if ($result) {
                Write-Output "✓ $server : 接続OK"
            } else {
                Write-Output "✗ $server : 接続NG"
            }
        }
        catch {
            Write-Output "✗ $server : エラー"
        }
    }
    Write-Output "=========================="
}

Test-NetworkConnections

これらの関数は、実際の業務でよく行う作業を自動化したものです。自分の業務に合わせてカスタマイズして使ってみてください。

まとめ

PowerShellの関数について、基本から応用まで詳しく解説しました。

この記事で学んだこと

関数の基本

  • 関数は「決まった処理をまとめて名前をつけたもの」
  • function 関数名 { 処理 } の形で作成
  • 再利用性とコードの読みやすさが向上

関数の一覧確認

  • Get-ChildItem Function: で全関数を表示
  • Get-Command -CommandType Function でより詳細な情報
  • 絞り込み検索で必要な関数を素早く発見

パラメーター機能

  • param() でパラメーターを定義
  • デフォルト値の設定が可能
  • 複数のパラメーターを組み合わせて使用

高度な機能

  • パイプライン処理(process ブロック)
  • エラー処理(try-catch 文)
  • beginprocessend ブロックによる効率的な処理

実用的な活用例

  • システム情報の表示
  • ログファイルの分析
  • ファイルの整理と管理
  • ネットワーク接続のテスト

覚えておきたいコマンド

# 関数の一覧表示
Get-ChildItem Function:

# 特定の関数の詳細確認
Get-Command 関数名 | Format-List *

# 関数の作成(基本形)
function 関数名 {
    param($パラメーター名)
    # 処理内容
}

コメント

タイトルとURLをコピーしました