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

コンピュータ
以前作成したスクリプトがファイルの件数が多くなるとメモリ不足になりそうでしたので対応してみました。
複数の外付けHDDのファイルを横断検索するスクリプト
私はデータファイルをベアドライブ(裸のHDD)に保存しており、HDDを使う場合はクレードル型の外付けUSB-HDDアダプタを使ってパソコンにつないで使っています。 HDDを昔でいうところのフロッピーディスクなどのリムーバブルメディアとして...

メモリ不足にはなりにくくなったと思いますが、さらに動作が遅くなったと思われます。
スポンサーリンク

スクリプト

# 
# 複数の外付けHDDのファイルを横断検索するスクリプト
#
# スクリプト名:SearchFileFromPortablHDD.ps1
#
# 更新履歴:
# 2019/05/18 メモリ不足になる為、更新時テキストファイルを配列に読み込むロジックを廃止
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

    # テキストファイルのファイル名を変更
    $bak_path = $DataBasePath + ".bak"
    Move-Item -LiteralPath $DataBasePath -Destination $bak_path


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

    # ファイルの一覧を取得
    (Get-ChildItem ($DriveName+"\") -File -Recurse -ErrorAction Continue) | % {
        $line = ($VolumeSerialNumber + ":" + (Split-Path -noQualifier $_.FullName))
        Write-Output $line | Add-Content $DataBasePath -Encoding utf8
    }
    
    # バックアップファイルの削除
    Remove-Item $bak_path
}

# 検索
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 
}

スポンサーリンク

コメント