Last active
July 14, 2023 08:46
-
-
Save esperecyan/a195f0195b0ae7c48c1a066e44dfeef2 to your computer and use it in GitHub Desktop.
『reset-shortcut-icons.js』へフォルダをドラッグ&ドロップすることで、Windowsのショートカットファイル (.lnk) について、アイコンがリンク切れしている、またはアイコンのパスがリンク先と一致するショートカットファイルのアイコンをリセットします。 ※右の「Raw」ボタンからダウンロードすると文字化けを回避できます
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* @file 『reset-shortcut-icons.js』へフォルダをドラッグ&ドロップすることで、Windowsのショートカットファイル (.lnk) について、アイコンがリンク切れしている、またはアイコンのパスがリンク先と一致するショートカットファイルのアイコンをリセットします。 | |
* @version 1.0.1 | |
* @license MPL-2.0 | |
* @author 100の人 | |
* @see {@link https://gist.github.com/esperecyan/a195f0195b0ae7c48c1a066e44dfeef2} | |
*/ | |
var FileSystemObject = WSH.CreateObject('Scripting.FileSystemObject'); | |
var Shell = WSH.CreateObject('WScript.Shell'); | |
/** | |
* @param {string} path - ショートカットファイルのパス。 | |
* @returns {boolean} アイコンのリセットを行った場合は `true`。 | |
*/ | |
function resetIcon(path) | |
{ | |
if (FileSystemObject.GetExtensionName(path) !== 'lnk') { | |
// ショートカットファイルでなければ | |
return false; | |
} | |
var shortcut = Shell.CreateShortcut(path); | |
if (!FileSystemObject.FileExists(shortcut.TargetPath)) { | |
// ショートカットファイルのリンク先が存在しなければ | |
return false; | |
} | |
var iconLocation = /^(.*),(-?[0-9]+)$/.exec(shortcut.IconLocation); | |
var iconFilePath = Shell.ExpandEnvironmentStrings(iconLocation[1]); | |
var iconIndex = iconLocation[2]; | |
if (iconFilePath === '' | |
|| shortcut.TargetPath !== iconFilePath && FileSystemObject.FileExists(iconFilePath)) { | |
// アイコンが設定されていない、またはリンク先と同一ではないアイコンファイルが存在すれば | |
return false; | |
} | |
shortcut.IconLocation = ',' + (shortcut.TargetPath === iconFilePath ? iconIndex : '0'); | |
shortcut.Save(); | |
return true; | |
} | |
var paths = []; | |
for (var i = 0; i < WSH.Arguments.length; i++) { | |
if (FileSystemObject.FileExists(WSH.Arguments.Item(i))) { | |
if (!resetIcon(WSH.Arguments.Item(i))) { | |
continue; | |
} | |
paths.push(WSH.Arguments.Item(i)); | |
} else { | |
var folders = [FileSystemObject.GetFolder(WSH.Arguments.Item(i))]; | |
for (var folder; folder = folders.shift(); ) { | |
for (var fs = new Enumerator(folder.SubFolders); !fs.atEnd(); fs.moveNext()) { | |
folders.push(fs.item()); | |
} | |
for (var files = new Enumerator(folder.Files); !files.atEnd(); files.moveNext()) { | |
var path = files.item().Path; | |
if (!resetIcon(path)) { | |
continue; | |
} | |
paths.push(path); | |
} | |
} | |
} | |
} | |
WSH.Echo('次のショートカットファイルのアイコンをリセットしました。\n\n' + paths.join('\n')); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment