如何用相对目标创build快捷方式(.lnk)?

我有一个可执行文件在我的磁盘上的密钥在dir \ program \ prog.exe我想有一个快捷方式的可执行文件在DoK的根目录,即prog.lnk将引用dir \ program \ prog 。可执行程序。

但是,似乎prog.lnk不能有一个相对的目标。 当DoK分配不同的驱动器号码时,这是一个问题,取决于连接到哪个PC。

任何build议,除了明显的把prog.exe放在根目录中吗?

(最终,我想在安装时使用nsis来做到这一点)

谢谢,

罗尼

尽管快捷方式可能包含到目标的相对路径(.lnk文件有一个名为SLDF_HAS_RELPATH的标志),但NSIS不支持创建“正常”快捷方式以外的任何内容,因此需要直接写入二进制数据(.lnk格式是相当稳定的,并已由MS记录)

!macro FileWriteHexBytes hb push ${h} push ${b} call FileWriteHexBytes !macroend Function FileWriteHexBytes exch $9 exch exch $0 push $1 push $2 loop: StrCpy $2 $9 2 StrLen $1 $2 IntCmp $1 2 0 end FileWriteByte $0 "0x$2" StrCpy $9 $9 "" 2 goto loop end: pop $2 pop $1 pop $0 pop $9 FunctionEnd Function CreateRelativeLnk exch $9 exch exch $0 push $1 FileOpen $0 "$0" w StrCmp $0 "" clean !insertmacro FileWriteHexBytes $0 "4C0000000114020000000000C000000000000046" !insertmacro FileWriteHexBytes $0 48010400 ;flags !insertmacro FileWriteHexBytes $0 00000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000 StrLen $1 $9 ;must be < 255! FileWriteByte $0 $1 FileWriteByte $0 0 FileWrite $0 "$9" ;relative target path !if 0 ;The icon is problematic, does not seem like it works with relative paths (but you can use system icons...) StrCpy $9 "explorer.exe" StrLen $1 $9 FileWriteByte $0 $1 FileWriteByte $0 0 FileWrite $0 "$9" !else !insertmacro FileWriteHexBytes $0 05003e2e657865 ;fake default .exe icon !endif clean: FileClose $0 pop $1 pop $0 pop $9 FunctionEnd 

像这样调用它:

 push "$temp\testlink.lnk" push "testdir\testapp.exe" ;full path to this is $temp\testdir\testapp.exe call CreateRelativeLnk 

虽然生成的.lnk似乎工作,我不知道如果我将在生产代码中使用此

一个更好的解决方案是像Oleg建议的那样创建一个NSIS应用程序(NSIS应用程序可以在运行时从自身读取的.exe末尾包含嵌入数据等)。

如果我们假设cmd.exe对于所有Windows安装都是相同的绝对路径(很可能,但不是傻瓜式的),那么你可以使用.lnk文件来启动cmd

 cmd.exe /c start /d. your command here 

/ d将目录设置为.lnk文件的目录

启动命令可能还有其他有用的选项(例如/ b)

安装“相对”

我正在使用一些黑客。 该屏幕截图显示了该方法:

它启动explorer.exe,然后传递一个相对路径,如下所示:

 %windir%\explorer.exe path\to\your\files\youFileName.example 

我正在使用一个名为“相对”的小工具 。 安装完成后,可以右键单击文件,然后选择Create relative shortcut... 它会弹出一个Save as...框。 这不像简单的拖放那样舒适,但它有帮助。 (它也使用它自己的特殊图标来创建链接,因此链接中不再有原始图标,请参见上面的内容,您可能会喜欢,也可能不喜欢。

你是对的。 您不能在可移动媒体上使用快捷键(.lnk),因为就像您自己写的一样,可移动媒体在不同情况下可以有不同的驱动器号。

如果您需要在驱动器的根目录中有一些东西,可以使用CMD,VBS或JS而不是快捷方式。 在某些情况下,也使用一个标准EXE,它使用像INI文件这样的配置文件从另一个子目录启动另一个程序。 在插入磁盘之后,实施启动安装程序是CD / DVD的典型做法。 大概这样也可以满足你的要求吗?

我相信NT 4资源工具包命令SHORTCUT.exe将创建相对链接的快捷方式。 我希望微软能够创建一个新的受支持的实用程序或者Powershell Cmdlet来促进相关的.lnk文件的创建,或者使得NTFS链接更像Linux的符号链接。 在此之前,我为此使用.cmd / .bat和.ps1文件。

Program.cmd

 @"%~dp0Relative\Path\Program.exe" %* 
  • @ =禁止命令回显。
  • %〜dp0 =扩展到脚本的目录。
  • 相对\路径=可以包括..来备份一个目录。
  • %* =将脚本收到的任何参数传递给Program.exe。

Program.ps1

不幸的是,尽管.cmd / .bat文件将从任何上下文(运行对话框,CMD提示符,Powershell,双击文件浏览器等)运行,但它们不能调用存储在UNC路径上的东西。 为了暴露UNC路径中的东西,在Powershell(我为Git和Mercurial这样的工具执行此操作)中,我将创建上述脚本的Powershell版本。

 &"$PSScriptRoot\Relative\Path\Program.exe" @args 
  • &=将Powershell放入命令模式,以便引号中的字符串得到运行。
  • “”=包含一个字符串,扩展任何变量。
  • $ PSScriptRoot =展开到脚本的目录。
  • 相对\路径=可以包括..来备份一个目录。
  • @args =将脚本收到的任何参数传递给Program.exe。