メインコンテンツまでスキップ

Eagleで無効なフォルダが存在する問題

· 約4分
mebiusbox
engineer

Eagleを使っているとライブラリの中に無効なフォルダが存在することがあります. ここではこの無効なフォルダに関する内容を残しておきます

Eagleを使っていると、ライブラリの中に無効なフォルダがあることに気づきました. この無効なフォルダとはEagleからは認識されていないフォルダのことです.

Eagleでは1つのファイルごとにディレクトリがライブラリのimagesディレクトリの中に作成され管理されているようです. その中にmetadata.jsonファイルやサムネイルなどが格納されています. 無効なフォルダはこのmetadata.jsonファイルが入っていません.ですから、Eagleからは認識されていないようです. ただし、確認したのは検索で見つかるかどうかなので、もしかすると内部では参照している可能性もあります. 記憶が曖昧なので、それが削除したものなのかEagleの不具合によって発生したのか見当がつきません. 少なくともEagleでのごみ箱は空になっている状態で、検索で見つからない以上、無効なフォルダと言っていいでしょう.

無効なフォルダを調べてみると、削除したものや重複したものがありました.それらは不要なので削除しておきたいです.

この無効なフォルダを探す場合はライブラリ内のディレクトリを走査してmetadata.jsonファイルが存在するかどうかを確認すればよさそうです. そこで、次のようなPowerShellスクリプトを作成してライブラリを走査し、無効なフォルダがあれば出力しています.また、削除する機能も入れました.

function Move-ToRecycleBin() {
[CmdletBinding(SupportsShouldProcess = $True, DefaultParameterSetName = 'Path')]
Param (
[SupportsWildCards()]
[Parameter(
Mandatory = $True,
Position = 0,
ParameterSetName = 'Path',
ValueFromPipeline = $True,
ValueFromPipelineByPropertyName = $True
)]
[string[]]$Path,

[Alias('LP')]
[Alias('PSPath')]
[Parameter(
Mandatory = $True,
Position = 0,
ParameterSetName = 'LiteralPath',
ValueFromPipeline = $False,
ValueFromPipelineByPropertyName = $True
)]
[string[]]$LiteralPath
)
Begin {
$shell = New-Object -ComObject Shell.Application
$trash = $shell.NameSpace(10)
}
Process {
if ($PSBoundParameters.ContainsKey('Path')) {
$targets = Convert-Path $Path
} else {
$targets = Convert-Path -LiteralPath $LiteralPath
}
$targets | Foreach-Object {
if ($PSCmdlet.ShouldProcess($_)) {
$trash.MoveHere($_)
}
}
}
}

function CheckUnused() {
[CmdletBinding()]
param(
[string]$LibraryPath,
[switch]$Remove,
[switch]$Force
)

if (Test-Path -LiteralPath $LibraryPath) {
$ImagePath = Join-Path $LibraryPath "images"
Get-ChildItem -Directory -LiteralPath $ImagePath | ForEach-Object {
Write-Progress -Activity "Checking..." -Status $_.Name
$metaDataJson = Join-Path $_.FullName "metadata.json"
if (-not(Test-Path -LiteralPath $metaDataJson)) {
Write-Host "Unused: $($_.FullName)"
Get-ChildItem -LiteralPath $_.FullName | ForEach-Object {
" " + $_.Name
}
if ($Remove) {
if ($Force) {
Move-ToRecycleBin -LiteralPath $_.FullName
} else {
Move-ToRecycleBin -Literalpath $_.FullName -Confirm
}
}
}
}
}
}

ここで使用しているMove-ToRecycleBinはゴミ箱への削除機能で「PowerShell でファイルやフォルダをごみ箱に入れる」を参考にして作成したものです.

CheckUnusedコマンドレットでEagleのライブラリをチェックします.-LibraryPathにはxxx.library (xxxは任意)のパスを指定します. -Removeで削除します.通常は削除確認しますが、-Forceを有効にすれば確認せずに削除します.

なお、ここに記述しているコードは使用する場合は自己責任でお願いいたします.

以上です.