複数の外付けHDDのファイルを横断検索するスクリプト

コンピュータ
私はデータファイルをベアドライブ(裸のHDD)に保存しており、HDDを使う場合はクレードル型の外付けUSB-HDDアダプタを使ってパソコンにつないで使っています。
HDDを昔でいうところのフロッピーディスクなどのリムーバブルメディアとして使う感覚になります。HDDは容量も選べて使い勝手はよいのですが、データファイルを複数のHDDに保存していると目的のファイルがどのHDDに保存されているか調べるだけで大仕事になります。

複数のHDD上のファイルの一覧を取得し単一のテキストファイルに保存しておき、ファイル検索は保存したテキストファイル内を文字検索するスクリプトを作りました。
テキストファイルの更新にかなり時間がかかるためあまり実用的ではないかもしれませんが、保存用であまり内容が変わらないHDDであればそれなりに使えるのではないかと思います。

スクリプト

# 
# 複数の外付けHDDのファイルを横断検索するスクリプト
#
# スクリプト名:SearchFileFromPortablHDD.ps1
param (
    [switch]$Search, # 検索モード
    [switch]$Update, # 更新モード
    [switch]$VSN, # ボリュームシリアルナンバーを取得
    [string]$DriveName, # ドライブ名、書式X:
    [string]$Keyword, # 検索文字
    [string]$DataBasePath = ($MyInvocation.MyCommand.Path + ".txt") # ファイルの一覧を保存するテキストファイル   
)

$ErrorActionPreference = "Stop"
Set-StrictMode -Version 2.0


# ドライブ名からボリュームシリアルナンバーを取得
function Get-VolumeSirialNumber
{
    param (
        $drive_name
    )
    Get-WmiObject Win32_LogicalDisk | ? {
        $_.DeviceID -eq $drive_name
    } | % {
        $_.VolumeSerialNumber
    }
}

# 更新
function Update
{
    param (
        $DriveName,
        $DataBasePath
    )
    
    

    $DataBase = @() # 配列の初期化

    # ボリュームシリアルナンバーの取得
    $VolumeSerialNumber = Get-VolumeSirialNumber $DriveName


    # ファイル一覧のテキストファイルを読み込み
    (Get-Content $DataBasePath -Encoding utf8) | ? {
        $_ -notmatch "^${VolumeSerialNumber}:"
    } | % {
        $DataBase += $_
    }

    # ファイルの一覧を取得
    (Get-ChildItem ($DriveName+"\") -File -Recurse -ErrorAction Continue) | % {
        $DataBase += ($VolumeSerialNumber + ":" + (Split-Path -noQualifier $_.FullName))
    }


    # ファイルの一覧をテキストファイルに出力
    rm $DataBasePath
    $DataBase | % {
        Write-Output $_ | Add-Content $DataBasePath -Encoding utf8
    }

}

# 検索
function Search
{
    param (
        $Keyword,
        $DataBasePath
    )
    (Get-Content $DataBasePath -Encoding utf8) | ? {
        $_ -match "${Keyword}"
    }

}

if ($Search) {
    echo "検索"
    
    Search $Keyword $DataBasePath

}
if ($Update) {
    echo "更新"

    Update $DriveName $DataBasePath

    echo "更新終了"
}
if ($VSN) {
    echo "ボリュームシリアルナンバー"

    Get-VolumeSirialNumber $DriveName 
}

使い方

更新

SearchFileFromPortableHDD.ps1 -Update -DriveName "検索するHDDのドライブ:"

検索対象にしたいHDDを接続し実行します。

検索

SearchFileFromPortableHDD.ps1 -Search -Keyword "検索キーワード"

検索キーワードは正規表現でマッチングしていますので、ファイルやフォルダの名称の一部とマッチングします。

ボリュームシリアルナンバーの取得

SearchFileFromPortableHDD.ps1 -VSN -DriveName "検索するHDDのドライブ:"

接続しているドライブのボリュームシリアルナンバーを取得します。HDDの識別用のコードになりますのでHDDにマジックなどで書き写しておくことをお勧めします。

テキストファイルについて

テキストファイルはデフォルトで「スクリプトのパス.txt」に保存されます。

テキストファイルにファイルのパスを保存するわけですがパスに含まれるドライブ名は接続したパソコンにより変化する為記録しません。
ドライブ名の位置にHDDの識別用にボリュームシリアルナンバーを採用しています。

保存されるの書式は以下のようになります。
「HDDのボリュームシリアルナンバー」:「ファイルのパス(ドライブ名除く)」

コメント