ひゃまだのblog

ひゃまだ(id:hymd3a)の趣味のブログ

Powershellで共有フォルダのファイルリストを検索する

(2025-01-27 初稿)

先日、Powershellで共有フォルダのファイルリストを作成する記事を書いた。

本記事は、その記事の続きで、せっかく作成したファイルリストもリストが巨大になると、エディタで検索するのもなかなか大変になってくる。

そこで、複数の検索語で検索できるようにPowershellスクリプトを作成した。

実はかなり以前から必要性を痛感しており、検索スクリプトを自作していたのだが、動作が遅くて使い物にならなかった。(T_T)

そこで、ChatGPTとGeminiに高速化の相談をしたところ、ChatGPTの解答が優れていたので、そちらを採用することにした。生成AIのおかげで便利な世の中になったもんだ。

ちなみ、高速化の最大の要点は、筆者の作成したスクリプトでは、「検索語1を検索後、マッチしたファイルリストを検索語2で検索して…」と順番に検索したのに対し、ChatGPTの解答は、「ファイルリストの1行を検索語1、検索語2、検索語3…と複数の検索語を一度に検索する」ようになっている点が優れていた。

ファイルリストを検索するスクリプト

さっそくファイルリスト検索するスクリプトを以下に示す。

なお、Powershellで文字列検索は、Select-Stringが一般的に用いられるが、Select-Stringは、長い行は途中で省略してしまうので、今回の目的には利用できず、1行1行Containsで検索している。

どなたか、Select-Stringの行を省略させない方法を知りませんか?

筆者は、以下のスクリプトPowershell ISEまたは適当なエディタ作成し、 SearchFileLine.ps1 として保存している。

# 共有フォルダのファイルリストを検索する
# SearchLine.ps1 Written by H.Yamada
# Ver0.02 2024-12-08 optimized

##### gloabal variable
$Usage = "SearchLine.ps1 Ver0.02 共有ハードディスクのファイルリストを検索するスクリプト"
Write-Host $Usage

# ファイルリストのあるフォルダ
# 場合によって古いファイルリストのファイルがあるので、最新のリストを用いる
$SearchFolder =  "\\somewhere\somefolder"
$fl = Get-ChildItem $SearchFolder\fl-*.txt | Sort-Object LastWriteTime -Descending
$SearchFile = $fl[0].Fullname  # 検索するファイルはひとつに絞る

### 検索語の入力
# 検索語をコピペしやすいように敢えてテキスト入力
$sword = Read-Host "検索語を半角カンマ(,)で区切って1つ以上入力。(例: aaa,
bbb)" $skey = $sword.split(',') | ForEach-Object { $_.Trim() } ##### functions function Select_Line {     param(         [string[]] $src_line,         [string[]] $keywords     )     $sel_line = @()     $cnt = 0     foreach ($line in $src_line) {         $match = $true         foreach ($keyword in $keywords) {      # 複数検索語を順に             if (-not $line.Contains($keyword)) {  # ファイルリストに対し検索                 $match = $false                 break             }         }         if ($match) {             $sel_line += $line             $cnt += 1         }     }     Write-Host "$($keywords -join ', ') : $cnt"     return $sel_line } ##### 検索開始 $SearchLine = Get-Content $SearchFile $Result = Select_Line $SearchLine $skey Write-Output $Result    # 結果の画面出力 pause

スクリプトの実行と使い方

作成したスクリプトで右クリックすると「Powershellで実行」を選ぶとターミナルが開いて実行してくれる。

ファイルリストが大きいとChatGPTの最適化を受けたスクリプトでもかなりの時間が掛かるのでご承知おきを。

複数の検索語で検索して、結果がポーズで止まっている状態で、必要なファイルを1行まるごとコピーして、「ファイル名を指定して実行」(Win+R)に貼り付けて「OK」をクリックすれば、目的のファイルを開いてくれる。

どなたかの参考になれば…