DirFilSearch_config.txt|コンフィギュレーション・ファイル〔バッチファイルと同じフォルダー内に置く〕

検索対象フォルダー,検索ワード,結果出力ファイル
C:\Users\%username%\Desktop\freeware,ChgKey15,C:\Users\%username%\Desktop\FindstrResult.txt
C:\Users\%username%\Desktop\freeware,KeySwap,C:\Users\%username%\Desktop\FindstrResult.txt
C:\Users\%username%\Desktop\freeware,audacity,C:\Users\%username%\Desktop\FindstrResult.txt
C:\Users\%username%\Desktop\freeware,yWriter,C:\Users\%username%\Desktop\FindstrResult.txt
C:\Users\%username%\Desktop\freeware,カレンダー,C:\Users\%username%\Desktop\FindstrResult.txt

DirFilSearch.bat|バッチファイル本体

:: バッチファイルをUTF-8で保存するときのバッチファイルの先頭は、【1】【2】のどちらでもよい。
:: UTF-8保存時は[BOMなし]と[改行コードCR+LF]の設定が必須である。
:: ●●●【1】
:: @echo off
:: chcp 65001 > nul
:: ●●●【2】
:: chcp 65001 > nul
:: @echo off

@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion

set "CONFIG_FILE=%~dp0DirFilSearch_config.txt"

REM -- コンフィグファイル存在チェック
if not exist "%CONFIG_FILE%" (
    echo Please create DirFilSearch_config.txt with "directory,word,result_file" per line.
    pause
    exit /b
)

REM -- 配列初期化
set COUNT=0

REM -- メニュー表示
echo --------------------------------------
echo [Search Settings List]
echo.

for /f "usebackq tokens=1,2,3 delims=," %%A in ("%CONFIG_FILE%") do (
    set /a COUNT+=1
    set "DIR[!COUNT!]=%%A"
    set "WORD[!COUNT!]=%%B"
    set "RESULT[!COUNT!]=%%C"
    echo [!COUNT!] Dir: %%A   Word: %%B   Output: %%C
    if !COUNT! geq 10 goto MENU
)

:MENU
echo.
set /p SEL=Select number to search (1-!COUNT!, or 9 to exit): 

if "%SEL%"=="9" goto END

REM -- 入力チェック
set /a NUM=0
for /l %%i in (1,1,!COUNT!) do (
    if "%SEL%"=="%%i" set /a NUM=%%i
)
if %NUM%==0 (
    echo Invalid selection.
    pause
    goto MENU
)

REM -- 選択内容取得
set "SEARCH_DIR=!DIR[%NUM%]!"
set "SEARCH_WORD=!WORD[%NUM%]!"
set "RESULT_FILE=!RESULT[%NUM%]!"

REM -- ディレクトリと出力ファイルの環境変数展開
call set "SEARCH_DIR=%SEARCH_DIR%"
call set "RESULT_FILE=%RESULT_FILE%"

if not exist "%SEARCH_DIR%" (
    echo Directory "%SEARCH_DIR%" does not exist.
    pause
    goto MENU
)

REM -- 検索結果ファイルを必ずクリア
break > "%RESULT_FILE%"

REM -- 一時ファイル名を生成
set "TMP_FILE=%TEMP%\DirFilSearch_tmp_%RANDOM%.txt"
break > "%TMP_FILE%"

REM -- 検索実行(PowerShellで日本語対応、結果は一時ファイルへ)
echo Searching "%SEARCH_DIR%" for "%SEARCH_WORD%" ...
powershell -NoLogo -NoProfile -Command ^
    "Get-ChildItem -Path '%SEARCH_DIR%' -Recurse -File -ErrorAction SilentlyContinue | Where-Object { $_.FullName -like '*%SEARCH_WORD%*' } | ForEach-Object { $_.FullName } | Set-Content -Encoding UTF8 '%TMP_FILE%'"

REM -- 検索結果が空かどうか判定(ファイルサイズ0バイトならメッセージ出力)
for %%A in ("%TMP_FILE%") do (
    if %%~zA==0 (
        echo 検索結果:該当情報なし。> "%RESULT_FILE%"
    ) else (
        copy /Y "%TMP_FILE%" "%RESULT_FILE%" > nul
    )
)

del "%TMP_FILE%"

echo.
echo Search complete. Result saved to: %RESULT_FILE%
pause
goto MENU

:END
endlocal