【PowerShell入門】Write-Verboseの使い方と活用術|ログ・デバッグ出力に最適

Windows

PowerShellでスクリプトを書いていて、こんな経験はありませんか?

  • スクリプトが動かないけど、なにが起きているのかわからない
  • 条件分岐やループの内部でなにが起きているのかしりたい
  • 普段は表示しないけど、必要なときだけ詳しい情報をみたい
  • スクリプトを本番用とデバッグ用で使い分けたい

そんなときに便利なのが「Write-Verbose」です。

これはPowerShellの「詳細ログ出力専用のコマンド」で、普段は表示されないけれど、必要に応じて確認できる優れた仕組みです。

この記事では、Write-Verboseの使い方・仕組み・実践例・注意点までを初心者向けに説明します。

スポンサーリンク

Write-Verboseってなに?

説明

Write-Verboseは、PowerShellで詳しい処理状況や補足情報を出力したいときにつかうコマンドです。

普通のWrite-Outputとはちがって、普段は出力が表示されません

でも、-Verboseフラグをつければ表示されるという仕組みです。

基本的な書き方

Write-Verbose "ここに表示したいメッセージ"

ただし、表示されるのは「条件付き」です。

Write-Verboseの特徴

  • 普段は見えない:スクリプトの通常実行では表示されない
  • 必要なときだけ見える:-Verboseオプションをつけたときだけ表示
  • デバッグに便利:開発中だけ詳しい情報をみることができる
  • 本番環境でも安心:余計な出力で画面が汚れない

Write-Verboseの出力を表示する方法

説明

Write-Verboseでメッセージを書いても、そのままでは表示されません

表示するには、特別な設定と-Verboseスイッチが必要です。

関数で使う場合

スクリプトの例

function Test-Verbose {
    [CmdletBinding()]  # この行が重要
    param()

    Write-Verbose "詳細メッセージです"
    Write-Output "通常の出力です"
}

# 実行方法
Test-Verbose          # 通常実行(詳細メッセージは表示されない)
Test-Verbose -Verbose # 詳細実行(詳細メッセージが表示される)

実行結果

通常実行の場合:

通常の出力です

-Verboseつきの場合:

VERBOSE: 詳細メッセージです
通常の出力です

スクリプトファイルで使う場合

ファイル(myscript.ps1)の内容

[CmdletBinding()]  # この行が重要
param()

Write-Verbose "スクリプト実行中..."
Write-Output "処理完了"

実行方法

# 通常実行
.\myscript.ps1

# 詳細実行
.\myscript.ps1 -Verbose

重要なポイント

[CmdletBinding()]という行がないと、-Verboseが効きません。

これを忘れがちなので注意してください。

実践例:Write-Verboseの活用方法

例1:ファイル処理の進捗表示

説明

ファイルをコピーする処理で、どこからどこにコピーしているかを詳しく知りたい場合の例です。

スクリプト

function Copy-Files {
    [CmdletBinding()]
    param (
        [string]$Source,      # コピー元
        [string]$Destination  # コピー先
    )

    Write-Verbose "=== ファイルコピー開始 ==="
    Write-Verbose "コピー元: $Source"
    Write-Verbose "コピー先: $Destination"
    
    # ファイルが存在するかチェック
    if (Test-Path $Source) {
        Write-Verbose "コピー元ファイルを確認しました"
    } else {
        Write-Verbose "エラー: コピー元ファイルが見つかりません"
        return
    }

    # 実際のコピー処理
    Copy-Item $Source -Destination $Destination -Recurse
    Write-Verbose "=== ファイルコピー完了 ==="
    
    Write-Output "ファイルのコピーが完了しました"
}

# 使用例
Copy-Files -Source "C:\data" -Destination "D:\backup" -Verbose

実行結果(-Verboseありの場合)

VERBOSE: === ファイルコピー開始 ===
VERBOSE: コピー元: C:\data
VERBOSE: コピー先: D:\backup
VERBOSE: コピー元ファイルを確認しました
VERBOSE: === ファイルコピー完了 ===
ファイルのコピーが完了しました

例2:ループ処理の確認

説明

繰り返し処理で、いま何回目の処理をしているかを確認したい場合の例です。

スクリプト

function Process-Numbers {
    [CmdletBinding()]
    param (
        [int]$Count = 5
    )

    Write-Verbose "=== 数値処理開始 ==="
    Write-Verbose "処理回数: $Count 回"

    foreach ($i in 1..$Count) {
        Write-Verbose "処理中... ($i / $Count)"
        
        # 何らかの処理(例:計算)
        $result = $i * $i
        Write-Verbose "結果: $i の2乗 = $result"
        
        # 少し待つ(処理のシミュレーション)
        Start-Sleep -Milliseconds 500
    }

    Write-Verbose "=== 数値処理完了 ==="
    Write-Output "すべての処理が完了しました"
}

# 使用例
Process-Numbers -Count 3 -Verbose

実行結果

VERBOSE: === 数値処理開始 ===
VERBOSE: 処理回数: 3 回
VERBOSE: 処理中... (1 / 3)
VERBOSE: 結果: 1 の2乗 = 1
VERBOSE: 処理中... (2 / 3)
VERBOSE: 結果: 2 の2乗 = 4
VERBOSE: 処理中... (3 / 3)
VERBOSE: 結果: 3 の2乗 = 9
VERBOSE: === 数値処理完了 ===
すべての処理が完了しました

例3:条件分岐の確認

説明

if文でどの条件に当てはまったかを確認したい場合の例です。

スクリプト

function Check-FileSize {
    [CmdletBinding()]
    param (
        [string]$FilePath
    )

    Write-Verbose "ファイルサイズチェック開始: $FilePath"

    if (Test-Path $FilePath) {
        Write-Verbose "ファイルが存在します"
        
        $fileInfo = Get-Item $FilePath
        $sizeKB = [math]::Round($fileInfo.Length / 1KB, 2)
        
        Write-Verbose "ファイルサイズ: $sizeKB KB"

        if ($sizeKB -gt 1000) {
            Write-Verbose "判定: 大きなファイル(1MB以上)"
            $category = "大"
        } elseif ($sizeKB -gt 100) {
            Write-Verbose "判定: 中程度のファイル(100KB〜1MB)"
            $category = "中"
        } else {
            Write-Verbose "判定: 小さなファイル(100KB未満)"
            $category = "小"
        }

        Write-Output "ファイル: $FilePath (サイズ: $category)"
    } else {
        Write-Verbose "エラー: ファイルが見つかりません"
        Write-Output "ファイルが見つかりません: $FilePath"
    }
}

# 使用例
Check-FileSize -FilePath "C:\Windows\System32\notepad.exe" -Verbose

他の出力コマンドとのちがい

比較表

コマンド名表示される条件標準出力に含まれる?主な用途
Write-Outputいつも表示含まれるメインの出力・結果
Write-Hostいつも表示含まれない画面表示専用(あまり推奨されない)
Write-Warningいつも表示含まれない警告メッセージ
Write-Errorいつも表示含まれないエラーメッセージ
Write-Debug-Debug指定時のみ含まれないデバッグ用
Write-Verbose-Verbose指定時のみ含まれない詳細情報・ログ用

使い分けの例

function Demo-OutputCommands {
    [CmdletBinding()]
    param()

    Write-Output "これは結果です"           # 常に表示(メイン出力)
    Write-Host "これは画面表示です"         # 常に表示(色付き可能)
    Write-Warning "これは警告です"          # 常に表示(黄色)
    Write-Error "これはエラーです"          # 常に表示(赤色)
    Write-Debug "これはデバッグ情報です"    # -Debug時のみ表示
    Write-Verbose "これは詳細情報です"      # -Verbose時のみ表示
}

# 実行方法の比較
Demo-OutputCommands                     # 基本出力のみ
Demo-OutputCommands -Verbose           # 詳細情報も表示
Demo-OutputCommands -Debug             # デバッグ情報も表示
Demo-OutputCommands -Verbose -Debug    # 両方表示

Write-Verboseの注意点と便利テクニック

注意点1:CmdletBindingを忘れない

ダメな例

function Bad-Example {
    # [CmdletBinding()] がない
    param()

    Write-Verbose "これは表示されません"
}

Bad-Example -Verbose  # エラーになる

良い例

function Good-Example {
    [CmdletBinding()]  # これが必要
    param()

    Write-Verbose "これは表示されます"
}

Good-Example -Verbose  # 正常に動作

注意点2:出力しすぎない

ダメな例(出力が多すぎ)

function Too-Much-Output {
    [CmdletBinding()]
    param()

    foreach ($i in 1..1000) {
        Write-Verbose "処理中: $i"  # 1000行も出力される
    }
}

良い例(適度な出力)

function Good-Output {
    [CmdletBinding()]
    param()

    foreach ($i in 1..1000) {
        if ($i % 100 -eq 0) {  # 100回に1回だけ表示
            Write-Verbose "処理中: $i / 1000"
        }
    }
}

便利テクニック1:ログ形式を統一する

function Write-LogMessage {
    [CmdletBinding()]
    param (
        [string]$Level = "INFO",
        [string]$Message
    )

    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Write-Verbose "[$timestamp] [$Level] $Message"
}

function Demo-Logging {
    [CmdletBinding()]
    param()

    Write-LogMessage -Level "START" -Message "処理開始"
    Write-LogMessage -Level "INFO" -Message "ファイルを読み込み中"
    Write-LogMessage -Level "INFO" -Message "データを処理中"
    Write-LogMessage -Level "END" -Message "処理完了"
}

Demo-Logging -Verbose

実行結果

VERBOSE: [2025-06-05 14:30:15] [START] 処理開始
VERBOSE: [2025-06-05 14:30:15] [INFO] ファイルを読み込み中
VERBOSE: [2025-06-05 14:30:15] [INFO] データを処理中
VERBOSE: [2025-06-05 14:30:15] [END] 処理完了

便利テクニック2:環境変数で制御する

function Smart-Verbose {
    [CmdletBinding()]
    param()

    # 環境変数でデバッグモードを制御
    if ($env:DEBUG_MODE -eq "ON") {
        $VerbosePreference = "Continue"  # 常に詳細表示
    }

    Write-Verbose "これは詳細情報です"
    Write-Output "処理完了"
}

# 使用例
$env:DEBUG_MODE = "ON"
Smart-Verbose  # -Verboseなしでも詳細表示される

よくある質問

Q:Write-VerboseとWrite-Debugのちがいは?

Write-Verbose

  • 一般的な詳細情報用
  • ユーザーが知りたい処理の流れ
  • -Verboseで表示

Write-Debug

  • プログラムのバグ調査用
  • 開発者向けの技術的な情報
  • -Debugで表示

Q:本番環境でWrite-Verboseは大丈夫?

はい、大丈夫です。-Verboseをつけなければ表示されないので、パフォーマンスにもほとんど影響しません。

Q:ファイルにログを保存したい場合は?

Write-Verboseは画面表示専用です。ファイルに保存したい場合は、別途ログ関数を作成するか、トランスクリプト機能をつかってください:

Start-Transcript -Path "log.txt"
# スクリプト実行
Stop-Transcript

まとめ

Write-Verboseのポイント

  • Write-VerboseはPowerShellの詳細ログ出力用コマンド
  • 普段は表示されないが、-Verboseオプションで確認可能
  • [CmdletBinding()]が必要な点に注意
  • 他の出力コマンドとの使い分けを理解することが重要
  • 本番用と開発用でログの出し分けができるので、品質管理にも役立つ

コメント

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