Windows Powershellで検索かつファイルを開くスニペットを書いたら大量のメモを管理できるようになった話

以前までScrapboxをメモとして書いていたのだがページ数が多くなるに連れて結局、見つけたい内容が見つけにくくなってしまった。原因としては構造化されなさすぎて、タイトルでさえどれに該当するか分からない。関連して、複数ページを一気に閲覧することが出来ず、内容を流し見しながら見ることが出来なかった。

Wordの目次機能を使うと、内容をベタ書きしていっても、章立ての部分にNavigations paneを用いて飛んでいけるし、大きく構造化した内容を頭の中に入れていける。そいうわけでWordでのメモに移行していった。

Wordに移行した際の問題点として、ファイルを開ける作業が手間になってきたことだ。複数フォルダーに分けるとどこにファイルがあるか分からなくなるから、接頭字を用いて分類する。research_academic_writing, hobby_music_list.docxなどだ。ところがファイル名が頭にあるのにいちいち該当ファイルを開くのは非常に馬鹿らしい。そういうわけで、Linuxでの操作に慣れていた僕は、Windows Powershellでコマンド一つでWordを開ける機能を欲するのだった。

コードとその使い方

以下が、該当コードになる。

function SearchAndOpenFile {
    param (
        [string]$searchPath,
        [string[]]$fileName
    )

    if ([System.Management.Automation.WildcardPattern]::ContainsWildcardCharacters($fileName[0])){
        $SearchFile = $fileName
    } else {
        $SearchFile = $fileName -join "*"
        $SearchFile = "*" + $SearchFile + "*"
    }
    Write-Host "Search word: " $SearchFile

    $filePaths = Get-ChildItem -Path $searchPath -Filter $SearchFile -Recurse | Select-Object -ExpandProperty FullName
    # If one file is found, open that.
    $n_files = $filePaths.Count
    if ($filePaths -ne $null) {
        if($n_files -eq 1){
            Write-Host "Signle matching file found:"
            Write-Host $filePaths
            $fileInfo = Get-Item $filePaths
            if ($fileInfo.Extension -eq ".docx"){
                Start-Process -FilePath $filePaths
            }
        } else {
            Write-Host "Multiple matching files found:"
            foreach ($file in $filePaths){
                Write-Host $file
            }
        }
    } else {
        Write-Host "File not found."
    }
}

New-Alias -Name "sao" -Value "SearchAndOpenFile"

Microsoft.PowerShell_profile.ps1 は、Powershell起動時に読み込まれるファイルで vim $profileで編集できる。(Linuxにおけるbashrcに該当)。僕の場合は、C:\Users\aflub\Documents\WindowsPowerShell 内にあり、上記のコードをsearch_and_open.ps1として保存し、. "$($HOME)\Documents\WindowsPowerShell\search_and_open.ps1"と書いて読み込んでおくようにする。

これを起動時のデフォルトのディレクトリから打つと、関連しないファイルまですべて検索されてしまうので、ディレクトリ移動のAliasも用意してあげる。例えば、Function cd_document {cd C:\Users\aflub\Documents}など。

そして、

sao . hobby # or sao . hobby, music

と打って一つだけ該当すれば、そのファイルが開けて、複数あれば候補のファイルのパスが表示される。

これで、大量のwordがあったとしても、接頭語でファイルを絞って必要なファイルを探し、大量の構造化された情報は一つ一つwordを開いてnavigation paneを使って外観して探していける。

———-雑感(`・ω・´)———-
初めてWindows Powershellのコードを書いてみた。このコードの多くは、ChatGPTさんに聞いて言って、基礎的な文法もその一環で学んでいった。自分で色々調べるよりも早く目標が達成出来てよかった。


コメント

タイトルとURLをコピーしました