有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

windows如何创建。用Java编写lnk文件?

我发现了许多用于处理windows(.lnk)快捷方式的解析解决方案,但我需要使用Java工具创建它们

因此,我的问题是:

  • 如何创建它们
  • (还是使用Files.createSymbolicLink更好?)-问题是它们的文件大小为零,并且没有像“普通”文件那样处理(因此,当我想要删除空文件夹时,符号快捷方式(内部)也会被删除,因为它们不被识别为“普通”文件))

共 (2) 个答案

  1. # 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();
    

    希望这对您有所帮助:)

    问候 约书亚·弗兰克

  2. # 2 楼答案

    我们发现最可靠的方法是生成一个临时变量。js文件,然后生成WSScript子进程。它感觉非常笨拙,但它避免了Java的任何弱点,并且可以与较旧的JRE一起使用(这对我们很重要,因为Files.createSymbolicLink甚至可能不适用于我们的一些用例)

    结果大致如下。您可能会将其重写为使用路径,而不是文件和其他NIO。2个特性等。所有传入变量都是纯字符串实例,在底部描述;它们可能是空的,但决不是空的

    需要注意的是,此代码用于在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的某个地方,但需要记住的是,它们不一定是这些文件夹的纯英文名称

    {}是,例如,“我的程序快捷方式”。这个target就是你所认为的,应该是一条获得最安全结果的完整路径

    icon字符串是一个时髦的Windows东西,您可以在其中指定图标文件名和索引号,类似于“MyApp.ico,0”。上面的代码将空图标字符串视为使用系统默认值

    description成为快捷方式的属性->;注释字段。如果不需要设置argumentsworkingDir可以保留为空