Как создать .lnk файл с Java?

1

Я нашел много решений для обработки ярлыков для окон (.lnk), но мне нужно создать их с помощью моего Java-инструмента.

Поэтому мои вопросы:

  • Как они могут быть созданы?
  • (или лучше использовать Files.createSymbolicLink?). Проблема в том, что они имеют размер 0 и не обрабатываются как "нормальные" файлы (поэтому, когда я хочу удалить пустые папки, символьные ярлыки (внутри) также удаляются, потому что они не распознаются как "нормальный" файл))
  • 0
    Существует хороший Java-только API упоминается здесь . Нет сценариев. API впечатляет с первого взгляда.
Теги:
shortcut

2 ответа

1

Я могу рекомендовать этот репозиторий на 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

1

Мы обнаружили, что наиболее надежным способом было создание временного файла.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 могут быть пустыми, если вам не нужно их устанавливать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню