0

我需要为我的应用程序创建一个快捷方式,并且该快捷方式需要具有相同的图标,因此不考虑 bat 文件而不是快捷方式。我还想要一个原生的 windows 解决方案或者 .NET 5.0 的解决方案,而不是第三方程序,我希望尽可能低到源。

我已经尝试过 mklink,但它没有提供设置快捷方式的“开始于:”目录的选项,这对于我需要为其创建快捷方式的应用程序至关重要。

4

1 回答 1

0

这是我为自己做的:

public class DesktopUtility : IDesktopUtility
{
    public void CreateShortcut(string targetPath, string shortcutLinkPath)
    {
        if (!shortcutLinkPath.EndsWith(".lnk"))
            shortcutLinkPath += ".lnk";

        CreateShortcutVBS(targetPath, shortcutLinkPath);
        if (!File.Exists(shortcutLinkPath))
            CreateShortcutPS(targetPath, shortcutLinkPath);
    }

    public void CreateShortcutVBS(string targetPath, string shortcutLinkPath)
    {
        if (!shortcutLinkPath.EndsWith(".lnk"))
            shortcutLinkPath += ".lnk";

        var workingDirectory = Path.GetDirectoryName(targetPath);
        var vbShortcutScript = "Set oWS = WScript.CreateObject(\"WScript.Shell\")\n" +
            $"sLinkFile = \"{shortcutLinkPath}\"\n" +
            "Set oLink = oWS.CreateShortcut(sLinkFile) \n" +
            $"oLink.TargetPath = \"{targetPath}\"\n" +
            $"oLink.WorkingDirectory = \"{workingDirectory}\"\n" +
            "oLink.Save";
        var fileName = Path.GetFileNameWithoutExtension(targetPath);
        var scriptFilePath = Path.Combine(workingDirectory, $"{fileName}.vbs");
        //var wscriptPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), @"System32\wscript.exe");
        try
        {
            using (var file = File.CreateText(scriptFilePath))
                file.Write(vbShortcutScript);
            var psi = new ProcessStartInfo
            {
                FileName = "wscript.exe",
                UseShellExecute = false,
                Arguments= $"/b \"{scriptFilePath}\""
            };
            Process.Start(psi).WaitForExit();
        }
        finally
        {
            if (File.Exists(scriptFilePath))
                File.Delete(scriptFilePath);
        }
    }

    public void CreateShortcutPS(string targetPath, string shortcutLinkPath)
    {
        if (!shortcutLinkPath.EndsWith(".lnk"))
            shortcutLinkPath += ".lnk";

        var workingDirectory = Path.GetDirectoryName(targetPath);

        var psi = new ProcessStartInfo
        {
            FileName = "powershell.exe",
            WindowStyle = ProcessWindowStyle.Hidden
        };
        psi.Arguments =
            "-windowstyle hidden  " +
            "$WshShell=New-Object -comObject WScript.Shell; " +
            $"$LinkPath = \\\"{shortcutLinkPath}\\\"; " +
            $"$Shortcut = $WshShell.CreateShortcut($LinkPath); " +
            $"$Shortcut.TargetPath = \\\"{ targetPath}\\\"; " +
            $"$Shortcut.WorkingDirectory = \\\"{workingDirectory}\\\"; " +
            "$Shortcut.Save();";
        Process.Start(psi).WaitForExit();
    }
}

我不喜欢 PowerShell 方法,因为它简要显示了窗口,并且我希望能够内联执行 vbscript,而不是通过文件,不知道如何。

于 2020-11-27T20:48:36.127 回答