
Everythingというファイル検索アプリを使っている。以前も紹介したが、ファイル名を検索するのが速いので、重宝している。
ただ、検索したいときに開くと、何も出てこないことがある。下のほうを見ると、データベースを読み込んでいると表示されている。
これが結構待たされる。使いたいときに限って読み込み中だと困る。
別の検索ソフトを入れるか、Everythingを二つ使えばどうにかならないかと思った。調べて、保存したファイル一覧を検索する予備用Everythingを作ることにした。さらに、その一覧も自動で更新するようにした。
今回使ったEverythingは1.4.1系だ。
普段用と予備用を分ける
普段用は今まで通りに使う。予備用は、前に保存しておいたファイル一覧だけを検索する。
つまり、普段用が読み込み中のときは、少し古い一覧で探すということだ。
最新でないと困るファイルもあるが、前からあるファイルを探したいだけなら、それでもいい。何も検索できずに待っているよりはいいと思った。
Everythingは、起動するときに別名を指定すると、普段用とは別の設定とデータで起動できる。また、EFUというファイル一覧を保存して検索できる。これを組み合わせる。公式の別名起動の説明と、ファイルリストの説明が参考になる。
普段用のEverythingをもう一度起動しても、別のEverythingがもう一つ立ち上がるわけではない。すでに開いている普段用が表示されるだけなので、読み込み中ならそのままだ。
そこで、予備用は別名で起動し、普段用とは設定とデータを分ける。ここがポイントだ。
なお、データベース読み込み中という表示だけで、毎回データベースを再構築しているのかまではわからなかった。今回は、その原因の解明より、待っている間にも探せるようにすることにした。
まずは一覧を保存する
普段用Everythingが正常に使えるときに、検索欄を空にして、フィルターを「すべて」にする。
EFUには、そのとき検索結果に表示されている項目が保存される。検索語や「画像」などのフィルターが残っていると、その条件に合うファイルだけの一覧になってしまう。データが壊れるわけではないが、予備の一覧からほかのファイルが抜けるため、ここでは絞り込みをすべて外しておく。
「ファイル → エクスポート」で、ファイルの種類を「EFU Everything File List」にして保存する。選択項目だけを書き出す設定があれば外す。名前は検索予備などでいい。
この一覧は、ファイル本体のバックアップではない。ファイル名や場所など、検索するための情報を保存したものだ。普段用の検索対象や除外設定によって、書き出される範囲も変わる。
予備用のショートカットを作る
普段Everythingを起動するショートカットをコピーする。名前を「Everything 予備」にした。
コピーした方を右クリックして「プロパティ」を開く。「ショートカット」タブの「リンク先」に書いてある実行ファイルの後ろに、半角スペースを入れて次を付ける。
-instance "Backup"
例えば、Everythingのインストール先が次の場所なら、完成形はこうなる。インストール先は自分の環境に合わせる。
"C:\Program Files\Everything\Everything.exe" -instance "Backup"
これで起動すると、ウィンドウのタイトルにBackupと付く。こちらが予備用だ。
最初に、NTFSボリュームのインデックス作成に管理者権限が必要だという画面が出た。
NTFSボリュームインデックスは、Cドライブなどに現在あるファイルの名前や場所を読み取り、検索できるようにするためのものだ。普段用のEverythingはこれを使っている。
予備用は、先ほど保存したEFUのファイル一覧だけを検索する。ドライブから現在の情報を読み取る必要はないので、「NTFSボリュームインデックスを作成しません」を選んだ。
ここで一度、保存した一覧ファイルのプロパティを開いてしまった。ショートカットのタブがないので、リンク先が編集できない。EFUは一覧そのものなので、違うものを開いていた。編集するのはEverythingのショートカットだ。
スタートメニューにしかアイコンがない場合は、Everythingを右クリックして「ファイルの場所を開く」からショートカットを探せる。普段用を残し、コピーした方を編集する。
予備用の「ファイル → ファイルリストを開く」で、保存したEFUを選ぶと検索できた。これだけでも、手動で使う予備にはなる。
一覧の作成も自動化する
手動で毎回エクスポートするのは面倒だ。忘れると思うので、ここも自動化する。
使うのは、Everythingの公式補助ツールのESと、Windowsのタスクスケジューラだ。ESで普段用Everythingの検索結果を書き出す。ESの公式説明に書き出しの指定が載っている。
ESを用意する
公式ダウンロードページの「Download Everything Command-line Interface」から入手する。
自分はx64版のESを使った。WindowsのCPU構成に合うものを選ぶ。ダウンロードしたZIPを展開し、ドキュメントに「Everything自動保存」というフォルダーを作って、中身を置いた。
このフォルダーを開くと、すぐに es.exe がある状態にする。
一度書き出してみる
普段用Everythingを起動し、検索できる状態にする。
CMDの作業場所をESのあるフォルダーにして、次を実行する。
es.exe -timeout 60000 -export-efu "検索予備_テスト.efu"
読み込み中なら最大60秒待ってから検索する指定だ。書き出し全体を60秒で打ち切る指定ではない。
処理が終わると、同じフォルダーにテスト用の一覧ができた。
ESのあるフォルダーが作業場所なら、環境変数のPATHへ登録しなくてもCMDから実行できる。別の場所でCMDが開いた場合は、次の形式で移動する。
cd /d "ESがあるフォルダーの実際のフルパス"
失敗しても前の一覧を残す
同じファイル名へ直接書き出すと、そのファイルは上書きになる。普段用が使えない時に、予備までなくなっては困る。
そこで、いったん別の名前へ書き出し、成功したら予備一覧と差し替えることにした。失敗したら前の一覧を残す。差し替え前の一覧も一つ残す。
下の内容をメモ帳に貼り付け、ESと同じフォルダーに Update-Backup.ps1 という名前で保存する。ファイルの種類は「すべてのファイル」、文字コードはWindows PowerShellで日本語を読めるように「UTF-8 BOM付き」にする。
$ErrorActionPreference = 'Stop'
$target = Join-Path $PSScriptRoot 'Backup.efu'
$temp = Join-Path $PSScriptRoot 'Backup.new.efu'
$previous = Join-Path $PSScriptRoot 'Backup.previous.efu'
$log = Join-Path $PSScriptRoot 'Backup.log'
try {
Set-Location -LiteralPath $PSScriptRoot
Remove-Item -LiteralPath $temp -Force -ErrorAction SilentlyContinue
& (Join-Path $PSScriptRoot 'es.exe') -timeout 60000 -export-efu $temp
if ($LASTEXITCODE -ne 0) {
throw 'Everythingからの書き出しに失敗しました。'
}
if (!(Test-Path -LiteralPath $temp)) {
throw '新しい一覧が作成されませんでした。'
}
$first = Import-Csv -LiteralPath $temp | Select-Object -First 1
if (!$first -or [string]::IsNullOrWhiteSpace($first.Filename)) {
throw '一覧が空か、形式を確認できませんでした。'
}
if (Test-Path -LiteralPath $target) {
[System.IO.File]::Replace($temp, $target, $previous)
} else {
[System.IO.File]::Move($temp, $target)
}
"$(Get-Date) 更新成功" | Add-Content -LiteralPath $log
} catch {
"$(Get-Date) 更新失敗: $($_.Exception.Message)" |
Add-Content -LiteralPath $log
exit 1
}
書き出しの終了状態と、ファイル名を含む一覧かを確認している。全件が漏れなく入っているかまで検査するものではない。
実行するときは、同じ作業場所のCMDで次を実行する。
powershell.exe -NoProfile -ExecutionPolicy Bypass -File ".\Update-Backup.ps1"
ファイルをダブルクリックしたら、開くアプリを選ぶ画面が出た。今回はそれを使わず、上の一行で実行する。
処理が終わったら Backup.log を開く。今回の日時で「更新成功」と出ていれば成功だ。実際に一覧ができて、ログにも更新成功と出た。
予備用に自動保存の一覧を登録する
先ほどは「ファイルリストを開く」で表示したが、自動保存に使う一覧を設定へ登録する。
タイトルにBackupと付いた予備用Everythingで操作する。普段用ではない。
- 「ファイル → ファイルリストを閉じる」で、一時的に開いている一覧を閉じる。項目が無効なら、そのままでいい。
- 「ツール → オプション → インデックス → ファイルリスト」を開く。
- 「追加」で、ESと同じフォルダーにできた
Backup.efuを登録する。 - 古い一覧が登録されていたら、その登録だけ外す。
- 「変更を監視」の項目があれば有効にする。
- 「OK」を押し、知っているファイル名を検索して確認する。
予備用にドライブやフォルダーのインデックス登録が残っている場合は、そちらの登録を外す。予備用は保存済み一覧だけを使うようにする。
これで予備用から検索できた。
タスクスケジューラへ登録する
最後に自動実行を登録する。
スタートメニューから「タスク スケジューラ」を開き、「タスクの作成」を選ぶ。名前は「Everything予備一覧の更新」にした。
設定する内容は次の通りだ。
| 項目 | 設定 |
|---|---|
| 実行ユーザー | 普段用Everythingを使う自分のユーザー |
| 実行条件 | ユーザーがログオンしているときのみ実行 |
| トリガー | 自分のログオン時 |
| 遅延 | 5分間 |
| 繰り返し | 1日間、継続時間は無期限 |
| 同じタスクが実行中の場合 | 新しいインスタンスを開始しない |
「操作」は「プログラムの開始」。プログラムには次を指定する。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
「引数の追加」には、次の文字に続けて半角スペースを入れ、引用符で囲んだスクリプトの実際のフルパスを付ける。
-NoProfile -ExecutionPolicy Bypass -File
スクリプトをShiftを押しながら右クリックして「パスのコピー」を使うと入力しやすい。「開始」欄は空欄でいい。スクリプトが自身のあるフォルダーを基準に動くようにしている。
最上位の特権は付けなかった。普段用EverythingはWindows起動時から起動するようにしておく。バッテリー中も更新したい場合は、AC電源で使用しているときだけ開始する条件を外す。
登録した後、タスクを右クリックして「実行」を押した。黒い画面がしばらく表示されたが、処理が終わると閉じた。ログを見ると、更新成功になっていた。タスクからの手動実行はできた。
次回のログオン後や、その後の繰り返し実行は、ログの日時が増えるかを見て確認することにする。
使うときの注意
普段は通常のEverythingを使う。読み込み中なら、予備のショートカットを開いて探す。
予備は前に保存した一覧なので、保存した後に追加したファイルは出てこない。移動や削除も反映されていないことがある。最新の情報が必要なら、普段用が使えるようになってから探す。
また、予備自体も起動時には一覧を読み込む。待ち時間が完全になくなるわけではない。「バックグラウンドで実行」を有効にして、一度開いた後も常駐させると、開き直すときの読み込みを減らせる。
パソコンの電源が切れている間は自動保存できない。普段用が起動していない時も更新に失敗することがある。その場合は前の一覧を使う。
もう一台にも同じ構成を持っていきたいと思っている。ESとスクリプトはコピーして使えるが、検索一覧はそれぞれのPCで作る。二台から同じ一覧へ上書きすると混ざってしまう。タスクの実行ユーザーとスクリプトのパスも、移行先に合わせる必要がある。
まとめ
Everythingが読み込み中で使えないときのために、保存した一覧を検索する予備を作った。予備から検索できることと、タスクから一覧を更新できることは確認できた。
最初の設定はちょっと手間だった。普段用が待っている間だけでも、前の一覧を使って探せるようにしたかったので、ひとまずこの形で使ってみる。
あとは、次回以降の自動更新が動いているか、ログを見て確認していこうと思う。