PowerShellからSQLiteでファイルのコメントを管理するテーブルを作成する2。

powershell7 コンピュータ
powershell7

まずファイル名で検索するスクリプトを作りたいと思うのですが、スクリプトの引数にファイルのパス(ファイル名)をセットし、コメントテーブルに該当レコードがあればコメントを返し、無ければ長さ0の文字列を返す仕様にします。その際、該当ファイルが、ローカルストレージ上に存在するか確認し、無い場合はコメントテーブルのレコードを削除するようにします。

スクリプト

ファイル名:SearchFile-FileComment.ps1

using namespace System.Data.SQLite

# ファイルを検索

param(
    [string]
    $FileName
)

# データベース接続の初期処理
. ".\Init-FileComment.ps1"

if ( $FileName -eq "" ) {
    Exit
}
# 相対パス ⇒ 絶対パス
#$FileName = (Resolve-Path $FileName).Path
$FileName = Join-Path (Get-Location) $FileName

# コマンドオブジェクト
$cmd = [SQLiteCommand]::new()
# コマンドオブジェクトとDBを接続
$cmd.Connection = $con

$result = ""

if (Test-Path $FileName) {
    # レコードを取得
$cmd.CommandText = @"
SELECT comment FROM file_comment WHERE full_name = '$FileName' 
"@
    $rec = $cmd.ExecuteReader()
    while ($rec.Read()) {
        $result = $rec['comment']
    }
    $rec.Close()
} else {
    # レコードの削除
$cmd.CommandText = @"
DELETE FROM file_comment WHERE full_name = '$FileName' 
"@
    $cmd.ExecuteNonQuery() | Out-Null
}


$result

モジュールのインポートでエラー

前の記事にも追記しましたが、モジュールのインポートが怪しい。
各スクリプト毎回実行するように、Init-FileComment.ps1でインポートするようにしてみましたが、初回に警告のような物が出ているので、これも正しいやり方ではないようです。警告は出ますが処理はされているようで、2回目以降は警告が出ないことから、自分のモジュールに対する理解が足りていないと思われます。

相対パスをを絶対パスに変換

PowerShellのResolve-Pathを使うと相対パスを絶対パスに変換してくれるのですが、ファイルが存在しないパスの場合エラーが発生します。この振る舞いは削除処理で都合が悪いので別な方法を探してみました。すぐに思いつくのが.NETのSystem.IO.Path.GetFullPath()を使う方法ですが、カレントディレクトリから見たパスを生成するのですが、PowerShellコンソールのカレントディレクトリとは別物らしく、好みで無いので不採用とします。
とりあえずPowerShellのJoin-PathにGet-Locationでカレントディレクトリとファイル名を引数に渡して絶対パスを生成しています。
作ってみて気が付いたのですが、ファイル名に絶対パスが渡されることを考えていませんでした。そのうち修正したいと思います。

コメント