1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[05] PowerShell実践例 ... デバッグ情報を充実させる

Last updated at Posted at 2021-07-25
本シリーズのトップページ
https://qiita.com/robozushi10/items/0b0605257ad39bc22895

はじめに

前項で、例外発生のコードを記したが、このとき例外発生元の関数情報などをハードコーディングしていた.

これを C言語の __FILE____LINE__ のような感じで埋め込めるようにしてみる.

 

環境

Windows 10 Pro
PowerShell バージョン 6系

プログラムについて

処理概要

次の 1〜5 の処理をする

1. module.ps1 を作成して __FILE__ , __LINE__ , __PATH__ を実装する.
  なお、__PATH__ は絶対パスを表示する機能を持つ.

2. 実処理をする sample.ps1 の中から 1 の module.ps1 をインクルードする.

3. sample.ps1 の中で __FUNC__ 相当(関数表示)を実装する.
   
4. sample.ps1 の中で __FILE__ , __LINE__ , __PATH__ を呼び出す

5. sample.ps1 を実行する.

module.ps1

# 本スクリプト置き場
$BATDIR = $PSScriptRoot

# デバッグログ設定 ... ここを切り替えると Write-Debug によるログが表示されなくなる
$DebugPreference = 'Continue'

# ファイル名を返す関数
function Get-ScriptBaseName { return (Split-Path  $MyInvocation.ScriptName -Leaf) }

# ファイル絶対パスを返す関数
function Get-ScriptFullName { return $MyInvocation.ScriptName }

# 行番号を返す関数
function Get-ScriptLineNumber { return $MyInvocation.ScriptLineNumber }

# 関数を変数として扱うための定義
new-item alias:__FILE__ -value Get-ScriptBaseName | Out-Null
new-item alias:__PATH__ -value Get-ScriptFullName | Out-Null
new-item alias:__LINE__ -value Get-ScriptLineNumber | Out-Null


sample.ps1

下記は 前回のコードにデバッグログを埋め込んだものである.

# module.ps1 を読み込む
. .\module.ps1

function sub($workdir)
{
  # デバッグログ
  Write-Debug "[$(__FILE__):$(__LINE__):$($MyInvocation.MyCommand)]"

  # 引数 $workdir で指示されたディレクトリが存在しなければエラー終了させる
  if(!(Test-Path -Type Container $workdir))
  {
     # 例外ログを強化した
     throw "<$workdir> was not found: no such directory [$(__PATH__):$(__LINE__):$($MyInvocation.MyCommand)]"
  }
}

function main()
{
  # デバッグログ
  Write-Debug "[$(__FILE__):$(__LINE__):$($MyInvocation.MyCommand)]"
  # 引数 workdir に ".\work" を指定して呼び出す
  sub -workdir ".\work"  
}

try
{
  # デバッグログ
  Write-Debug "[$(__FILE__):$(__LINE__):$($MyInvocation.MyCommand)]"
  # main 関数を呼び出す
  main
}
catch
{
  Write-Host "異常発生: $($error[0])"
  # ここに確実に終了させたい処理を書けば良い
}

実行結果

次のようにデバッグ情報がより詳細になった

DEBUG: [sample.ps1:23:a.ps1]
DEBUG: [sample.ps1:16:main]
DEBUG: [sample.ps1:5:sub]
異常発生: <.\work> was not found: no such directory [c:\work\sample.ps1:10:sub]

 

参考にしたサイト

URL
https://www.shiftwiki.nl/spls
https://forsenergy.com/ja-jp/windowspowershellhelp/html/64517b77-a2a7-4890-8482-f393fa555fd2.htm
https://stackoverflow.com/questions/817198/how-can-i-get-the-current-powershell-executing-file
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?