在Go中创建Windows快捷方式(.lnk)

时间:2015-09-07 11:59:40

标签: windows go desktop-shortcut

我想创建一个Windows快捷方式(.lnk)到桌面和Golang中的startmenu。

我实际上得到了桌面&通过gowin模块的Startmenu文件夹,我想创建一个快捷方式来查找位置。

我搜索了但是我找不到任何golang项目。我应该创建吗?还有其他漂亮的方法吗?

5 个答案:

答案 0 :(得分:4)

使用https://github.com/go-ole/go-ole

ole.CoInitializeEx(0, ole.COINIT_APARTMENTTHREADED|ole.COINIT_SPEED_OVER_MEMORY)
oleShellObject, err := oleutil.CreateObject("WScript.Shell")
if err != nil {
    return err
}
defer oleShellObject.Release()
wshell, err := oleShellObject.QueryInterface(ole.IID_IDispatch)
if err != nil {
    return err
}
defer wshell.Release()
cs, err := oleutil.CallMethod(wshell, "CreateShortcut", dst)
if err != nil {
    return err
}
idispatch := cs.ToIDispatch()
oleutil.PutProperty(idispatch, "TargetPath", src)
oleutil.CallMethod(idispatch, "Save")

答案 1 :(得分:1)

不,在golang中没有任何漂亮的方法可以创建.lnk文件。

主要原因是,.lnk文件是特定于Windows的。

在Windows中,即使是本机程序也需要使用OLE(对象链接和嵌入)和COM(组件对象模型)来创建快捷方式文件,如this answer中所述。

在我看来,在golang中解决这个问题的一种方法是使用gowin,并尝试与OLE COM进行通信。

OR

编写一个本机windows组件,它可以完成创建.lnk文件的实际工作,并通过你的go程序生成它的进程。

答案 2 :(得分:1)

如果出于任何原因您不想使用外部 go 包,这里有一个替代方案。 正如 Alexis Paques 所提到的,您可以使用 Powershell 在 Windows 下创建快捷方式。优点是,它已经在几乎所有 Windows 环境中可用。这是在 shell:startup 文件夹中创建快捷方式的实现,它将在启动时为当前用户自动启动链接程序:

package main

import (
    "bytes"
    "log"
    "os/exec"
    "strings"
)

type PowerShell struct {
    powerShell string
}

var WIN_CREATE_SHORTCUT = `$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("$HOME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\MyAPP.lnk")
$Shortcut.TargetPath = "PLACEHOLDER"
$Shortcut.Save()`

// New create new session
func New() *PowerShell {
    ps, _ := exec.LookPath("powershell.exe")
    return &PowerShell{
        powerShell: ps,
    }
}

func (p *PowerShell) execute(args ...string) (stdOut string, stdErr string, err error) {
    args = append([]string{"-NoProfile", "-NonInteractive"}, args...)
    cmd := exec.Command(p.powerShell, args...)

    var stdout bytes.Buffer
    var stderr bytes.Buffer
    cmd.Stdout = &stdout
    cmd.Stderr = &stderr

    err = cmd.Run()
    stdOut, stdErr = stdout.String(), stderr.String()
    return
}

// enableAutostartWin creates a shortcut to MyAPP in the shell:startup folder
func enableAutostartWin() {
    ps := New()
    exec_path := "C:\\MyAPP.exe"
    WIN_CREATE_SHORTCUT = strings.Replace(WIN_CREATE_SHORTCUT, "PLACEHOLDER", exec_path, 1)
    stdOut, stdErr, err := ps.execute(WIN_CREATE_SHORTCUT)
    log.Printf("CreateShortcut:\nStdOut : '%s'\nStdErr: '%s'\nErr: %s",
        strings.TrimSpace(stdOut), stdErr, err)
}

此答案基于 this SO answer 和此 gist

答案 3 :(得分:0)

来自this subject的外部程序解决方案:

NirSoft

的可执行快捷方式
shortcut "f:\winnt\system32\calc.exe" "~$folder.desktop$" "Windows Calculator" 
shortcut "f:\winnt\system32\calc.exe" "~$folder.programs$\Calculators" "Windows Calculator" 
shortcut "f:\Program Files\KaZaA\Kazaa.exe" "c:\temp\MyShortcuts" "Kazaa" 
shortcut "f:\Program Files" "c:\temp\MyShortcuts" "Program Files Folder" "" "f:\winnt\system32\shell32.dll" 45 
shortcut "f:\Program Files" "c:\temp\MyShortcuts" "Program Files Folder" "" "" "" "max"

Optimumx

的可执行快捷方式
Shortcut.exe /f:"%USERPROFILE%\Desktop\sc.lnk" /a:c  /t:%USERPROFILE%\Desktop\scrum.pdf

.vbs

Set oWS = WScript.CreateObject("WScript.Shell")
sLinkFile = "C:\MyShortcut.LNK"
Set oLink = oWS.CreateShortcut(sLinkFile)
    oLink.TargetPath = "C:\Program Files\MyApp\MyProgram.EXE"
 '  oLink.Arguments = ""
 '  oLink.Description = "MyProgram"   
 '  oLink.HotKey = "ALT+CTRL+F"
 '  oLink.IconLocation = "C:\Program Files\MyApp\MyProgram.EXE, 2"
 '  oLink.WindowStyle = "1"   
 '  oLink.WorkingDirectory = "C:\Program Files\MyApp"
oLink.Save

Powershell脚本

set TARGET='D:\Temp'
set SHORTCUT='C:\Temp\test.lnk'
set PWS=powershell.exe -ExecutionPolicy Bypass -NoLogo -NonInteractive -NoProfile

%PWS% -Command "$ws = New-Object -ComObject WScript.Shell; $s = $ws.CreateShortcut(%SHORTCUT%); $S.TargetPath = %TARGET%; $S.Save()"

答案 4 :(得分:0)

使用VBS的 AWFUL 工作 golang解决方案;

while (list.size() < 100) {
        list.add(null);
}