Skip to content

Instantly share code, notes, and snippets.

@esperecyan
Last active July 14, 2023 08:46
Show Gist options
  • Save esperecyan/a195f0195b0ae7c48c1a066e44dfeef2 to your computer and use it in GitHub Desktop.
Save esperecyan/a195f0195b0ae7c48c1a066e44dfeef2 to your computer and use it in GitHub Desktop.
『reset-shortcut-icons.js』へフォルダをドラッグ&ドロップすることで、Windowsのショートカットファイル (.lnk) について、アイコンがリンク切れしている、またはアイコンのパスがリンク先と一致するショートカットファイルのアイコンをリセットします。 ※右の「Raw」ボタンからダウンロードすると文字化けを回避できます
/**
* @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