【PR】 バッチファイル

複数のショートカットを1つにまとめて整理するバッチファイル【図解】

2025-03-22

アイキャッチ画像

こんな方におすすめ

  • 複数のショートカットをまとめて1つファイルから呼び出したい
  • 沢山あるショートカットを整理してすっきりしたい

この記事では、複数のショートカットがメニュー化されたバッチファイルを自動生成するバッチファイルを紹介します。

沢山あるショートカットを1つにまとめて整理できます。

このバッチファイルは、この記事の最後にあるコードをメモ帳に貼り付けるだけで誰でも簡単に作れます。

このバッチファイルの概要を以下にイラストで示します。

「複数のショートカットを1つにまとめて整理するバッチファイル」の概要

上のイラストのように、このバッチファイルによって、複数のショートカットのリストを含むバッチファイルが新たに作成されます

生成バッチファイルから、ショートカット先のファイル/フォルダを呼び出せます。

沢山あるショートカットが1つまとまってスッキリします

陰キャくじら
陰キャくじら




バッチファイルの使い方

ショートカットを1つのフォルダ内に集めます

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

複数のショートカットを1つのフォルダの中に入れた状態

ショートカットの種類は何でもOKです。

ファイルへのショートカットでもフォルダへのショートカットでもOKです。

ショートカットをドラッグアンドドロップします

ショートカットを一度にドラッグアンドドロップします。

ドラッグアンドドロップ先は、バッチファイルのアイコンの上です。

(バッチファイルの存在場所はどこでもOKです。ショートカットと同じフォルダの中でもかまいません)

バッチファイルのアイコンの上に複数のショートカットをドラッグアンドドロップする様子

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

陰キャくじら
陰キャくじら

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

ショートカットをドラッグアンドドロップした場合に表示される処理状況と結果

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

ShortcutMenu.batのアイコン

既にShortcutMenu.batが存在する場合は、上書きはされず、末尾に番号が付いたファイルが新規に作成されます。

ドラッグアンドドロップして一度に登録できるショートカットの最大数は50~60くらいです

別々のフォルダにあるショートカットをドラッグアンドドロップして登録することはできません

バッチファイルをダブルクリックします

ShortcutMenu.batをダブルクリックします。

ShortcutMenu.batのアイコン

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

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



当ブログのバッチファイル一覧

以下は、このブログで紹介しているバッチファイルの一覧です。

コピペするだけで使えます

陰キャくじら
陰キャくじら

各バッチファイルの概要をイラストで見たい方は、こちらをご参照ください。

ファイル名の一括変更

ファイル名を一括で変更するバッチファイルこちら

ファイル名の一部を一括で変更/削除するバッチファイルこちら

ファイル名に作成日/更新日を一括追加するバッチファイルこちら

ファイル名の先頭/末尾の文字列を追加/削除するバッチファイルこちら

拡張子の一括変更

ファイルの拡張子を一括で変更するバッチファイルこちら

ファイル情報の取得

ファイルのフルパスを瞬時に取得するバッチファイルこちら

フォルダ内のファイル情報をCSV出力するバッチファイルこちら(ファイル名、フルパス、作成日、更新日、属性などの情報が取得できます)

ショートカット整理

複数のショートカットを1つにまとめて整理するバッチファイルこちら

ファイル整理

ファイルを種類ごとに自動でフォルダ分けするバッチファイルこちら

データバックアップ

パソコンデータをミラーリングしてUSBメモリにバックアップするバッチファイルこちら

【スポンサーリンク】



-バッチファイル
-,