この記事では、複数のショートカットがメニュー化されたバッチファイルを自動生成するバッチファイルを紹介します。
沢山あるショートカットを1つにまとめて整理できます。
このバッチファイルは、この記事の最後にあるコードをメモ帳に貼り付けるだけで誰でも簡単に作れます。
このバッチファイルの概要を以下にイラストで示します。

上のイラストのように、このバッチファイルによって、複数のショートカットのリストを含むバッチファイルが新たに作成されます。
生成バッチファイルから、ショートカット先のファイル/フォルダを呼び出せます。
沢山あるショートカットが1つまとまってスッキリします

バッチファイルの使い方
ショートカットを1つのフォルダ内に集めます
登録したいショートカットを1つのフォルダの中に集めます(デスクトップ上に集めてもかまいません)。

ショートカットの種類は何でもOKです。
ファイルへのショートカットでもフォルダへのショートカットでもOKです。
ショートカットをドラッグアンドドロップします
ショートカットを一度にドラッグアンドドロップします。
ドラッグアンドドロップ先は、バッチファイルのアイコンの上です。
(バッチファイルの存在場所はどこでもOKです。ショートカットと同じフォルダの中でもかまいません)

バッチファイルのアイコン表示を大きくしておくと、ドラッグアンドドロップしやすいです

ショートカットをドラッグアンドドロップすると、以下のように処理の状況と結果が表示されます。

同時に、同じフォルダの中に「ShortcutMenu.bat」というバッチファイルが自動で作成されます。

既にShortcutMenu.batが存在する場合は、上書きはされず、末尾に番号が付いたファイルが新規に作成されます。
ドラッグアンドドロップして一度に登録できるショートカットの最大数は50~60くらいです
別々のフォルダにあるショートカットをドラッグアンドドロップして登録することはできません
バッチファイルをダブルクリックします
ShortcutMenu.batをダブルクリックします。

ダブルクリックすると、以下のようなメニューが開きます。

対応する番号を入力してエンターキーを押すと、ショートカット先のファイル/フォルダが開きます。
ショートカット自体が呼び出されるのではなく、ショートカット先のファイル/フォルダが直接的に呼び出されます。
そのため、登録した元のショートカット自体を移動しても削除しても、バッチファイルは機能します。
バッチファイルはどの場所にあってもOKです。

デスクトップ上のショートカットをまとめるのに便利ですね!
はい、すっきりしますよ

補足説明
説明の表示
バッチファイルをダブルクリックすると、以下のように、バッチファイルの説明が表示されます。

ダブルクリックした場合は、単に説明が表示されるだけで、何も処理は行われません。
説明が見たくなったらダブルクリックしてください。
ファイルとフォルダの登録
このバッチファイルは、ショートカット以外にも、ファイルとフォルダを直接的に登録できます。
しかし、登録できるのは、ショートカットの登録と同様に、1つのフォルダの中にあるファイル/フォルダだけです。
登録後にファイル/フォルダを移動させると、バッチファイルのメニューからそれらを呼び出せなくなります。
特殊な文字をファイル名に含むファイル
特殊な文字(「!」や「&」など)をファイル名に含むファイルは、メニューへの登録に失敗する可能性があります
登録に失敗した場合は、処理結果が以下のようになります。

この場合は、ファイル名に特殊な文字が含まれていないかをチェックし、改名するなどしてから、再度登録してください。
ドラッグアンドドロップしたファイルの中に、特殊な文字を含むファイルが含まれていた場合、ドラッグアンドドロップしたファイルの個数が誤って報告される場合があります。
バッチファイルの作成方法(コード)
このバッチファイルの作り方はシンプルです。
別の記事で紹介した「バッチファイルの作成方法」の手順3で、以下のコードをメモ帳に貼り付けるだけです。
バッチファイルの名前は何でもかまいません。
@echo off
setlocal enabledelayedexpansion
:: V01L01
:: バッチファイル自身の場所を取得
set "scriptFolder=%~dp0"
:: ドラッグ&ドロップか単独実行かを判別
if "%~1"=="" (
goto show_instructions
) else (
goto save_arguments
)
:show_instructions
cls
echo =======================================================
echo * ShortcutMenu Creator *
echo =======================================================
echo.
echo [ 機能説明 ]
echo このバッチファイルは複数のショートカット/ファイル/フォルダを
echo 1つのメニューにまとめるためのツールです。
echo.
echo [ 使い方 ]
echo 1. ショートカット/ファイル/フォルダをこのバッチファイルの
echo アイコンの上にドラッグアンドドロップしてください。
echo 2. 自動的に「ShortcutMenu.bat」が生成されます。
echo 3. 生成されたバッチファイルを実行すると、ドロップした項目の
echo 一覧が表示されます。
echo 4. 番号を入力すると、対応する項目が開きます。
echo.
echo [ 特徴 ]
echo - ショートカット(.lnk)の場合、リンク先の設定を維持します
echo - 通常のファイルやフォルダも同様に登録できます
echo - メニューから簡単に目的のファイル/フォルダにアクセスできます
echo.
echo =======================================================
echo ショートカット/ファイル/フォルダをドラッグアンドドロップしてください
echo =======================================================
pause
exit /b
:save_arguments
:: ドラッグアンドドロップされたファイルを一時ファイルに保存(バッチファイルと同じフォルダ)
set "argFile=%scriptFolder%menu_arguments.tmp"
if exist "%argFile%" del "%argFile%"
:: すべての引数を一時ファイルに保存
set "totalDropped=0"
:save_next_arg
if "%~1"=="" goto process_files
set /a "totalDropped+=1"
echo %~f1>>"%argFile%"
shift
goto save_next_arg
:process_files
echo 処理を開始します...
echo ドラッグアンドドロップされたアイテム: %totalDropped% 個
:: バッチファイル自身のあるフォルダを使用
set "batchFolder=%scriptFolder%"
:: 出力ファイル名の基本設定
set "baseOutputFile=%batchFolder%ShortcutMenu"
set "extension=.bat"
set "outputFile=%baseOutputFile%%extension%"
echo ファイル名を確認中...
:: 既に同名のファイルがあれば、番号を付けて別ファイルにする
set counter=1
:check_file_exists
if exist "%outputFile%" (
set "outputFile=%baseOutputFile%_%counter%%extension%"
set /a counter+=1
goto check_file_exists
)
echo 出力ファイル: %outputFile%
:: 処理結果カウンター
set "successCount=0"
set "errorCount=0"
set "processedCount=0"
:: ファイル情報を一時ファイルに保存(バッチファイルと同じフォルダ)
set "tempFile=%scriptFolder%sortedfiles.tmp"
if exist "%tempFile%" del "%tempFile%"
:: 引数ファイルから各ファイルを処理
for /f "usebackq tokens=*" %%f in ("%argFile%") do (
set /a processedCount+=1
set "filePath=%%f"
set "fileNameExt="
for %%i in ("!filePath!") do (
set "fileName=%%~ni"
set "fileNameExt=%%~nxi"
)
if not exist "!filePath!" (
echo エラー: 「!fileNameExt!」が見つかりません。スキップします。
set /a errorCount+=1
) else (
:: ファイル名と拡張子とパスをペアで保存(ソートのため)
echo !fileName!^|!filePath!^|!processedCount!^|!fileNameExt! >> "%tempFile%"
set /a successCount+=1
)
)
:: 処理数の確認(デバッグ用)
set /a "totalProcessed=!successCount!+!errorCount!"
if not !totalProcessed! EQU !totalDropped! (
echo 報告: 処理カウントが一致しません。ドロップ: !totalDropped!, 処理済: !totalProcessed!
set errorCount=!totalDropped!
set /a errorCount-=!successCount!
)
:sort_files
:: ファイル名でソート(PowerShellを使用)
echo ファイル名でソート中...
if not exist "%tempFile%" (
echo 処理可能なファイルがありませんでした。
goto cleanup
)
:: 登録されたアイテムが0の場合はバッチファイル作成をスキップ
if %successCount% EQU 0 (
echo 登録できたアイテムがありません。バッチファイルは作成しません。
goto cleanup
)
echo バッチファイルを作成中...
:: 出力ファイルの作成開始
echo @echo off > "%outputFile%"
echo setlocal enabledelayedexpansion >> "%outputFile%"
echo. >> "%outputFile%"
echo :: ファイルパスを変数に定義 >> "%outputFile%"
:: ソート結果の一時ファイル(バッチファイルと同じフォルダ)
set "sortedFile=%scriptFolder%sortedfiles_sorted.tmp"
powershell -Command "Get-Content '%tempFile%' | Sort-Object { $_.Split('|')[0] } | Set-Content '%sortedFile%'"
:: カウンターの初期化
set count=0
:: 変数定義部分を追加(ソートされたファイルパスとファイル名を変数に格納)
for /f "usebackq tokens=1-4 delims=|" %%a in ("%sortedFile%") do (
set /a count+=1
set "fileName=%%a"
set "filePath=%%b"
set "origIndex=%%c"
set "fileNameExt=%%d"
:: メニューエントリの配列に保存
set "menuName[!count!]=!fileName!"
set "menuPath[!count!]=!filePath!"
set "menuIndex[!count!]=!origIndex!"
set "menuNameExt[!count!]=!fileNameExt!"
:: 変数定義をバッチファイルに追加
echo set "file!count!_path=!filePath!" >> "%outputFile%"
echo set "file!count!_name=!fileNameExt!" >> "%outputFile%"
)
echo. >> "%outputFile%"
echo :menu >> "%outputFile%"
echo cls >> "%outputFile%"
echo echo ===== メニュー ===== >> "%outputFile%"
echo echo. >> "%outputFile%"
:: メニュー項目の追加(遅延環境変数を使用)
for /L %%n in (1,1,%count%) do (
echo echo %%n. "^!file%%n_name^!" >> "%outputFile%"
)
:: 改行を追加
echo. >> "%outputFile%"
echo echo. >> "%outputFile%"
:: 入力検証を含むメニュー選択部分を追加
echo :input_choice >> "%outputFile%"
echo set /p choice=番号を入力: >> "%outputFile%"
echo. >> "%outputFile%"
echo :: 入力検証 >> "%outputFile%"
echo set "valid=0" >> "%outputFile%"
echo for /L %%%%i in (1,1,%count%) do ( >> "%outputFile%"
echo if "%%choice%%" == "%%%%i" set "valid=1" >> "%outputFile%"
echo ^) >> "%outputFile%"
echo. >> "%outputFile%"
echo if "%%valid%%" == "0" ( >> "%outputFile%"
echo echo 無効な番号です。1-%count% の間で入力してください。 >> "%outputFile%"
echo echo. >> "%outputFile%"
echo pause >> "%outputFile%"
echo goto menu >> "%outputFile%"
echo ^) >> "%outputFile%"
echo メニュー部分の作成完了。アクション部分を作成中...
:: ソートされたファイルに対してアクションを作成
for /L %%n in (1,1,%count%) do (
set "filePath=!menuPath[%%n]!"
set "fileName=!menuName[%%n]!"
set "fileNameExt=!menuNameExt[%%n]!"
set "isShortcut=0"
:: ファイル拡張子を取得
for %%e in ("!filePath!") do set "fileExt=%%~xe"
echo アイテム %%n/%count% を処理中: !fileNameExt!
:: エスケープ処理
set "escapedPath=!filePath:\=\\!"
:: ファイルの種類をチェック
if /i "!fileExt!" == ".lnk" (
set "isShortcut=1"
echo - ショートカット処理中...
:: ショートカットのターゲットを取得(エスケープ処理)
for /f "tokens=*" %%t in ('powershell -command "$ws = New-Object -ComObject WScript.Shell; $shortcut = $ws.CreateShortcut(\"!escapedPath!\"); $shortcut.TargetPath"') do (
set "target=%%t"
)
:: ショートカットの引数を取得
for /f "tokens=*" %%a in ('powershell -command "$ws = New-Object -ComObject WScript.Shell; $shortcut = $ws.CreateShortcut(\"!escapedPath!\"); $shortcut.Arguments"') do (
set "args=%%a"
)
:: ショートカットの作業ディレクトリを取得
for /f "tokens=*" %%w in ('powershell -command "$ws = New-Object -ComObject WScript.Shell; $shortcut = $ws.CreateShortcut(\"!escapedPath!\"); $shortcut.WorkingDirectory"') do (
set "workdir=%%w"
)
:: 生成するバッチファイルに条件とアクションを書き込む
echo if "%%choice%%" == "%%n" ( >> "%outputFile%"
:: ファイル存在チェックの追加(遅延環境変数を使用)
echo if not exist "^!file%%n_path^!" ( >> "%outputFile%"
echo echo エラー: ショートカット「^!file%%n_name^!」が見つかりません。 >> "%outputFile%"
echo echo 削除されたか移動された可能性があります。 >> "%outputFile%"
echo echo. >> "%outputFile%"
echo pause >> "%outputFile%"
echo goto menu >> "%outputFile%"
echo ^) >> "%outputFile%"
:: ターゲットのチェック(ショートカットの場合)
echo if "!target!" NEQ "" if not exist "!target!" ( >> "%outputFile%"
echo echo エラー: ショートカット「^!file%%n_name^!」のリンク先が見つかりません。 >> "%outputFile%"
echo echo リンク先: !target! >> "%outputFile%"
echo echo 削除されたか移動された可能性があります。 >> "%outputFile%"
echo echo. >> "%outputFile%"
echo pause >> "%outputFile%"
echo goto menu >> "%outputFile%"
echo ^) >> "%outputFile%"
:: PowerShellで起動し、ショートカットの設定を維持
if not "!workdir!" == "" (
if not "!args!" == "" (
echo powershell -Command "try { Start-Process -FilePath '!target!' -ArgumentList '!args!' -WorkingDirectory '!workdir!' } catch { Write-Host 'エラーが発生しました: $_'; pause }" >> "%outputFile%"
) else (
echo powershell -Command "try { Start-Process -FilePath '!target!' -WorkingDirectory '!workdir!' } catch { Write-Host 'エラーが発生しました: $_'; pause }" >> "%outputFile%"
)
) else (
if not "!args!" == "" (
echo powershell -Command "try { Start-Process -FilePath '!target!' -ArgumentList '!args!' } catch { Write-Host 'エラーが発生しました: $_'; pause }" >> "%outputFile%"
) else (
echo powershell -Command "try { Start-Process -FilePath '!target!' } catch { Write-Host 'エラーが発生しました: $_'; pause }" >> "%outputFile%"
)
)
echo goto end >> "%outputFile%"
echo ^) >> "%outputFile%"
) else (
:: 通常のファイルまたはフォルダ - PowerShellで起動(遅延環境変数を使用)
echo - 通常ファイル/フォルダ処理中...
echo if "%%choice%%" == "%%n" ( >> "%outputFile%"
:: ファイル存在チェックの追加(遅延環境変数を使用)
echo if not exist "^!file%%n_path^!" ( >> "%outputFile%"
echo echo エラー: 「^!file%%n_name^!」が見つかりません。 >> "%outputFile%"
echo echo 削除されたか移動された可能性があります。 >> "%outputFile%"
echo echo. >> "%outputFile%"
echo pause >> "%outputFile%"
echo goto menu >> "%outputFile%"
echo ^) >> "%outputFile%"
echo powershell -Command "try { Start-Process -FilePath '^!file%%n_path^!' } catch { Write-Host 'エラーが発生しました: $_'; pause }" >> "%outputFile%"
echo goto end >> "%outputFile%"
echo ^) >> "%outputFile%"
)
)
:: バッチファイルの終了部分
echo :end >> "%outputFile%"
echo endlocal >> "%outputFile%"
:cleanup
:: 一時ファイルの削除
if exist "%tempFile%" del "%tempFile%"
if exist "%sortedFile%" del "%sortedFile%"
if exist "%argFile%" del "%argFile%"
:: 相対パスを表示するために出力ファイル名から絶対パスを取り除く
set "displayFile="
if %successCount% GTR 0 (
for %%f in ("%outputFile%") do set "displayFile=%%~nxf"
)
echo.
echo ================================================
echo 処理完了
echo ================================================
echo ドロップされたアイテム: %totalDropped% 個
echo 登録できなかったアイテム: %errorCount% 個
echo 正常に登録されたアイテム: %successCount% 個
echo.
if %successCount% GTR 0 (
echo ファイル "%displayFile%" を作成しました。
echo このファイルを実行するとメニューから項目を選択できます。
) else (
echo 登録できたアイテムがないため、メニューファイルは
echo 作成されませんでした。
)
echo ================================================
pause
当ブログのバッチファイル一覧
以下は、このブログで紹介しているバッチファイルの一覧です。
コピペするだけで使えます

各バッチファイルの概要をイラストで見たい方は、こちらをご参照ください。
ファイル名の一括変更
拡張子の一括変更
ファイルの拡張子を一括で変更するバッチファイルはこちら
ファイル情報の取得
ショートカット整理
複数のショートカットを1つにまとめて整理するバッチファイルはこちら
ファイル整理
ファイルを種類ごとに自動でフォルダ分けするバッチファイルはこちら
データバックアップ
パソコンデータをミラーリングしてUSBメモリにバックアップするバッチファイルはこちら