Я нашел много решений для обработки ярлыков для окон (.lnk), но мне нужно создать их с помощью моего Java-инструмента.
Поэтому мои вопросы:
Я могу рекомендовать этот репозиторий на GitHub:
https://github.com/BlackOverlord666/mslinks
Там я нашел простое решение для создания ярлыков:
ShellLink.createLink("path/to/existing/file.txt", "path/to/the/future/shortcut.lnk");
Если вы хотите читать ярлыки:
File shortcut = ...;
String pathToExistingFile = new ShellLink(shortcut).resolveTarget();
Надеюсь, это поможет вам :)
С уважением Josua Frank
Мы обнаружили, что наиболее надежным способом было создание временного файла.js, а затем порождать подпроцесс WScript. Он чувствует себя очень глупым, но он избегает любых слабых явлений Java и работает со старыми JRE (это было важно для нас, поскольку Files.createSymbolicLink
может быть даже недоступен для некоторых наших случаев использования).
Результат выглядел неопределенно следующим образом. Вероятно, вы могли бы переписать его для использования Path вместо File и других функций NIO.2 и т.д. Все входящие переменные являются обычными экземплярами String, описанными внизу; они могут быть пустыми, но никогда не являются нулевыми.
Важно отметить, что этот код предназначен для создания ярлыков в "специальной папке" Windows, а не только в произвольных местах. Вы можете приспособить его для этого.
File scriptFile = File.createTempFile ("whatever", ".js");
try (PrintWriter script = new PrintWriter(scriptFile)) {
script.printf("try {\n");
script.printf("wshshell = WScript.CreateObject(\"WScript.Shell\")\n");
script.printf("specDir = wshshell.SpecialFolders(\"%s\")\n", folder);
script.printf("shortcut = wshshell.CreateShortcut(specDir + \"\\\\%s.lnk\")\n", shortcutName);
script.printf("shortcut.TargetPath = \"%s\"\n", target);
script.printf("shortcut.Arguments = \"%s\"\n", arguments);
script.printf("shortcut.WindowStyle = 1\n");
script.printf("shortcut.HotKey = \"\"\n");
if (icon.length() > 0)
script.printf("shortcut.IconLocation = \"%s\"\n", icon);
script.printf("shortcut.Description = \"%s\"\n", description);
script.printf("shortcut.WorkingDirectory = \"%s\"\n", workingDir);
script.printf("shortcut.Save()\n");
script.printf("} catch (err) {\n");
// Commented by default
script.printf("/*WScript.Echo(\"name:\")\nWScript.Echo(err.name)\n");
script.printf("WScript.Echo(\"message:\")\nWScript.Echo(err.message)\n");
script.printf("WScript.Echo(\"description:\")\nWScript.Echo(err.description)\n");
script.printf("WScript.Echo(\"stack:\")\nWScript.Echo(err.stack)\n");
script.printf("*/\n");
script.printf("WScript.Quit(1)\n");
script.printf("}\n");
script.close();
// now run cscript.exe with arguments "//nologo" and the full
// path to 'script', using something like ProcessBuilder and Process
}
Вы можете проверить значение выхода процесса, а если оно равно нулю, удалите временный файл. Если что-то пошло не так, вы можете оставить файл для расследования, в том числе отредактировать скрипт вручную, чтобы раскомментировать демпинг ошибок внизу.
folder
- это специальное имя Windows для целевой папки, например, "SendTo" или "StartMenu" и т.д. Полный список находится на MSDN где-то, но главное помнить, что они не обязательно являются простыми английскими именами для эти папки.
shortcutName
есть, например, "Моя программа Ярлык". target
- это то, что вы думаете, и должно быть полным путем для достижения самых безопасных результатов.
Строка icon
- это фанковая вещь Windows, в которой вы указываете имя файла значка и индексный номер, что-то вроде "MyApp.ico, 0". В приведенном выше коде рассматривается пустая строка значка с использованием системного значения по умолчанию.
description
становится ярлыком Свойства → Поле комментария. arguments
и workingDir
могут быть пустыми, если вам не нужно их устанавливать.