EXE への複数のショートカットを作成するバッチ ファイルまたはスクリプトを作成する方法

EXE への複数のショートカットを作成するバッチ ファイルまたはスクリプトを作成する方法

こんにちは。フォルダー名と一致する exe がすべて入ったフォルダーが 122 個ほどあります。フォルダー内の各 exe に 'ショートカット' タグなしでショートカットを作成するスクリプトを書く方法はありますか。巧妙なスクリプトを使って手動で 1 つずつ実行することを避けたいだけです...

答え1

rem must be run in a window with admin privileges
rem windows 10 cmd batch file to create a hard shortcut to all .exe files on a volume if placed in the root folder; 
rem in a folder and all subfolders if not placed in the root folder. the shortcut is created in the folder where the .exe is.
rem the "shortcut" extension should not be part of the filename.  the .lnk extension should be part of the filename.  
rem links that already exist to .exe files should be deleted.
rem see mklink /? and https://ss64.com/nt/mklink.html
rem mklink saveShortcutAs targetOfShortcut
@echo off 
setlocal enableextensions
rem begin turn off shortcut name extension
rem see https://www.tenforums.com/tutorials/4663-shortcut-name-extension-turn-off-windows-10-a.html
REG ADD "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer" /V link /T REG_Binary /D 00000000 /F
Reg Delete "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\NamingTemplates" /V ShortcutNameTemplate /F
taskkill /f /im explorer.exe
start explorer.exe
rem end turn off shortcut name extension
rem the following command deletes all links to .exe files.          
FOR /f "tokens=*" %%a IN ('dir /b /s *.exe.lnk') DO del "%%a"
FOR /f "tokens=*" %%a IN ('dir /b /s *.exe') DO mklink /h "%%a.lnk" "%%a"
exit /b

mklink /? を参照してください。

見るss64.com mklink

cmd /? を参照してください。

/ については、こちらをご覧ください。

dir /? を参照してください。

見るss64.comで

見るショートカット名の拡張子をオン/オフにする

見るWindows 10 のシンボリック リンク、ハード リンク、ディレクトリ ジャンクション

管理者権限でウィンドウで実行する必要がある Windows 10 cmd バッチ ファイルを作成します。このバッチ ファイルにより、ルート フォルダーに配置されている場合はボリューム上のすべての .exe ファイルへのハード ショートカットが作成され、ルートに配置されていない場合はフォルダーとすべてのサブフォルダー内のすべての .exe ファイルへのハード ショートカットが作成されます。「ショートカット」拡張子はファイル名の一部にしないでください。.lnk 拡張子はファイル名の一部にする必要があります。.exe ファイルへの既存のリンクは削除する必要があります。

答え2

ショートカットを作成するための私のお気に入りの方法は、バッチ内で一時的な VB スクリプトを作成することです。解決策は次のようになります。

@echo off

set "des=C:\Where\You\Want\The\Shortcuts"
set "src=C:\Root\Folder\Of\Executables"

setlocal enabledelayedexpansion
for /r "%src%" %%A in (*.exe) do (
    set "exe=%%A"
    set "name=%%~nA"

    set "SCRIPT=%TEMP%\%RANDOM%-%RANDOM%-%RANDOM%-%RANDOM%.vbs"

    echo Set oWS = WScript.CreateObject^("WScript.Shell"^) >> !SCRIPT!
    echo sLinkFile = "%des%\!name!.lnk" >> !SCRIPT!
    echo Set oLink = oWS.CreateShortcut^(sLinkFile^) >> !SCRIPT!
    echo oLink.TargetPath = "!exe!" >> !SCRIPT!
    echo oLink.Save >> !SCRIPT!

    cscript /nologo !SCRIPT!
    del !SCRIPT!

)

これにより、ショートカットを配置する場所 (または他のフォルダーdesに配置する場合) と実行ファイルが配置されている場所 ( ) の両方の変数が設定されます。これは、for ループで変数を使用できるようにするためです。つまり、ディレクトリにあるすべての実行可能ファイル ( )を選択し、.exe の完全修飾パスを に設定し、.exe の名前を(拡張子を含まない) に設定します。次の部分は VB スクリプトです。TEMPフォルダーにランダムに名前が付けられた .vbs ファイルとして設定し、そのスクリプトに VBS コマンドをエコーし​​、実行して削除します。これは、各実行可能ファイルのショートカットが作成されるまで、for ループの各反復で実行されます。%USERPROFILE%\Desktopsrcsetlocal enabledelayedexpansionfor*.exesrcexenameSCRIPT

VBS 行について注意すべき重要な点:sLinkFileショートカットが作成される場所とその名前を決定します。oLink.TargetPath実行可能ファイルの完全なパスを参照します。forループ内の変数には ではなく が!使用されます。括弧を VBS ファイルにエコーする場合、 でエスケープする必要があります。これで目的どおりに機能することを願っています。および変数を設定するだけで済むはずです。%^dessrc

答え3

投稿せずにはいられないパワーシェルバージョン:

$TopFolder = 'C:\FolderWithExeSubfolders'

Get-ChildItem -Path $TopFolder -Filter *.exe -File -Recurse | ForEach-Object -Begin {
    $WSHshell = New-Object -com wscript.shell
} -Process {
    ### Using the folder name as the base name for the shortcut. This allows you the
    ###    option of giving the folder a "display name" to be used.
    $NewLnkPath             = '{0}\{1}.lnk' -f $_.DirectoryName, $_.Directory.Name
    $NewShortcut            = $WSHshell.CreateShortcut($NewLnkPath)
    $NewShortcut.TargetPath = $_.FullName

    ### Optional
    ### $NewShortcut.Arguments        = <string>
    ### $NewShortcut.Description      = <string>
    ### $NewShortcut.Hotkey           = <string>
    ### $NewShortcut.IconLocation     = <string>
    ### $NewShortcut.WindowStyle      = <1|2|7>
    ### $NewShortcut.WorkingDirectory = <string>

    $NewShortcut.Save()
} -End {}

関連情報