前回テーブルの作成と登録まで作成しましたので、今回は問い合わせスクリプトを組みたいと思います。
PowerShellからSQLiteでファイルのコメントを管理するテーブルを作成する。
ファイルに紐づくコメントやサムネイル画像などを管理する方法を模索していて、サフィックスをつけた隠しファイルを作成したり、NTFSのADSを使ってコメントを埋め込んだりしてみました。前者は隠しファイルが意外と邪魔だったり、後者は同一ファイルシ...
まずファイル名で検索するスクリプトを作りたいと思うのですが、スクリプトの引数にファイルのパス(ファイル名)をセットし、コメントテーブルに該当レコードがあればコメントを返し、無ければ長さ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のJoin-PathにGet-Locationでカレントディレクトリとファイル名を引数に渡して絶対パスを生成しています。
作ってみて気が付いたのですが、ファイル名に絶対パスが渡されることを考えていませんでした。そのうち修正したいと思います。
コメント