代码之家  ›  专栏  ›  技术社区  ›  ronys

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

  •  14
  • ronys  · 技术社区  · 14 年前

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

    但是,prog.lnk似乎没有相对的目标。这是一个问题,当DoK将有不同的驱动器号分配给它,这取决于它所连接的PC。

    (最终,我希望在安装时使用nsis完成此操作)

    谢谢,

    罗尼

    5 回复  |  直到 14 年前
        1
  •  9
  •   Anders    14 年前

    虽然快捷方式可能包含到目标的相对路径,但(.lnk文件有一个名为 SLDF_HAS_RELPATH

    !macro FileWriteHexBytes h b
    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似乎可以工作,但我不确定是否会在生产代码中使用它

        2
  •  11
  •   aelgn    14 年前

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

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

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

        3
  •  3
  •   Community noseratio    4 年前

    我用了一点黑客技术。该方法如此屏幕截图所示:

    相对的 像这样的路径:

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

    我用的是 small tool called "Relative" Create relative shortcut... . 然后会弹出一个 Save as...

        4
  •  1
  •   Oleg    14 年前

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

    如果您需要在驱动器的根目录中有一些内容,请使用CMD、VBS或JS而不是快捷方式。在某些情况下,还可以使用标准的EXE,它使用INI文件等配置文件从另一个子目录启动另一个程序。CD/DVD在插入磁盘后启动安装程序是一种典型的做法。也许这种方式也能满足你的要求?

        5
  •  0
  •   Nathan Hartley    8 年前

    我相信nt4资源包命令 SHORTCUT.exe

    @"%~dp0Relative\Path\Program.exe" %*
    
    • @=抑制命令回显。
    • Relative\Path=可能包括。。备份目录。
    • %*=将脚本接收到的任何参数传递到Program.exe。

    不幸的是,尽管.cmd/.bat文件将从任何上下文(运行对话框、命令提示符、Powershell中的命令、文件资源管理器中的双击等)运行,但它们不能调用存储在UNC路径上的内容。为了在UNC路径中公开内容,在Powershell中(我为Git和Mercurial等工具执行此操作),我将创建上述脚本的Powershell版本。

    &"$PSScriptRoot\Relative\Path\Program.exe" @args
    
    • &
    • “”=包含字符串,展开任何变量。
    • Relative\Path=可能包括。。备份目录。