複数の外付け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
}
コメント