如何将通过 Chocolatey 安装的所有可执行文件的符号链接放置在特定目录中?

mrs*_*ahu 5 powershell symbolic-link command-line chocolatey

Chocolatey - PowerShell - 符号链接

我使用 Chocolatey 包管理器安装了一些包。$PATH我不想将每个安装目录添加到 PATH 或我在 PowerShell中的变量中,而是希望创建一个目录并将符号链接放置到每个包的可执行文件中。我为以下软件包执行了此操作:

  • 清洁工
  • 谷歌浏览器
  • 火狐
  • 所有这些都运行良好。最近我安装了 VSCode 和 VLC,同样的方法不起作用。我使用此命令在 PowerShell 中创建符号链接:


    New-Item -ItemType SymbolicLink -Path "vlc.exe" -Value "C:\Program Files\VideoLAN\VLC\vlc.exe"
    双击符号链接时,VLC(和 VSCode)都运行良好。有没有更好的方法来做到这一点(为什么这种方法不起作用)?

    fer*_*der 8

    tl;dr:您尝试做的事情不可能以您想要的方式进行。幸运的是,ShimGenerator可以做到这一点(这就是它的设计目的,它与 Chocolatey 一起提供): & "$env:ChocolateyInstall\tools\shimgen.exe" --output="$env:ChocolateyInstall\bin\vlc.exe" --path=" C:\Program Files\VideoLAN\VLC\vlc.exe" -iconpath="C:\Program Files\VideoLAN\VLC\vlc.exe"

    为 VLC 创建的 Shim

    为什么符号链接(Symlink)不起作用

    这些可执行文件具有它们期望相对于可执行文件的依赖项。您需要对文件及其所有相关文件/文件夹进行符号链接- 所以换句话说,您不能简单地对文件进行符号链接,您可能需要对目录进行符号链接并将该目录放在 PATH 上,这会破坏你试图达到的目的。

    匀场是更好的方法

    Chocolatey在包目录中找到可执行文件时创建垫片。当文件具有依赖关系时(如您所见),符号链接会失效。

    我们在https://chocolatey.org/docs/features-shim#benefits 上写了更多关于它的文章(重点是我的):

    这些是创建 shim 的好处:

    • 提供调用目标可执行文件的 exe 文件。
    • 在它所在的位置运行目标可执行文件,这意味着所有依赖项和其他使用的东西都在原始位置
    • 当项目需要提升权限时,垫片将引发 UAC 提示。
    • exe 可以从 powershell、bash、cmd.exe 或其他 shell 中调用,就像调用目标一样。
    • 阻止并等待命令行应用程序完成运行,在运行 GUI 应用程序时立即退出。
    • 如果目标在创建时存在,则使用目标的图标。
    • 比符号链接效果更好。Windows 上的符号链接落在文件依赖项上。因此,如果您的文件依赖于其他文件和 DLL,则还需要链接所有这些文件和 DLL。
    • 不需要像创建符号链接(symbolic links)那样的特殊权限。因此,您可以在没有管理权限的情况下创建垫片。

    如果符号链接效果更好,我们可能会使用它们,而不是花费大量时间在 shimgen 上。垫片功能页面上也有一个常见问题解答

    巧克力包装中的垫片

    当在包目录中找到可执行文件时,Chocolatey 会自动创建垫片

    您也可以在chocolateyInstall.ps1脚本中(在包装中)使用Install-BinFile. 在https://chocolatey.org/docs/helpers-install-bin-file查看更多详细信息。

    如何符号链接 VLC

    要完全符号链接 VLC,您还需要符号链接以下文件和文件夹(以及这些文件夹中的任何子文件夹和文件)vlc.exe

    在此处输入图片说明

    虽然我可以提供一个脚本来符号链接整个事物,但我认为没有必要,因为它几乎是一种徒劳的方法。