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)均可正常运行。有没有更好的方法(以及为什么此方法不起作用)?
答案1
总结:您尝试做的事情无法按照您想要的方式完成。幸运的是,垫片生成器可以做这个确切的事情(这就是它的设计目的,它与 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"
为什么符号链接 (Symlink) 不起作用
这些可执行文件具有它们期望与可执行文件相关的依赖项。您需要对文件进行符号链接及其所有依赖文件/文件夹- 换句话说,您不能简单地对文件进行符号链接,您可能需要对目录进行符号链接并将该目录放在 PATH 上,这会违背您想要实现的目的。
垫片是一种更好的方法
Chocolatey 创造垫片当它在软件包目录中找到可执行文件时。当文件具有依赖关系时,符号链接会失效(如您所见)。
我们在https://chocolatey.org/docs/features-shim#benefits(重点是我的):
创建垫片有以下好处:
- 提供调用目标可执行文件的 exe 文件。
- 在目标可执行文件所在的位置运行它,这意味着所有依赖项和其他使用的东西都在原始位置
- 当项目需要提升权限时,垫片将引发 UAC 提示。
- 可以从 powershell、bash、cmd.exe 或其他 shell 调用该 exe,就像调用目标一样。
- 阻止并等待命令行应用程序完成运行,在运行 GUI 应用程序时立即退出。
- 如果目标在创建时存在,则使用目标的图标。
- 比符号链接效果更好。Windows 上的符号链接因文件依赖性而失效。因此,如果您的文件依赖于其他文件和 DLL,则所有这些文件和 DLL 也需要链接。
- 不需要像创建符号链接那样的特殊权限。因此,您无需管理权限即可创建垫片。
如果符号链接能更好地发挥作用,我们可能会使用它们,而不是花费大量时间在 shimgen 上。shim 功能页面上的常见问题解答也一样。
巧克力包装中的垫片
Chocolatey 自动创建垫片当在包目录中找到可执行文件时。
您也可以使用chocolateyInstall.ps1
脚本(在包中)执行此操作Install-BinFile
。查看更多详细信息https://chocolatey.org/docs/helpers-install-bin-file。
如何对 VLC 进行符号链接
要完全符号链接 VLC,除了以下内容之外,您还需要符号链接以下文件和文件夹(以及这些文件夹中的任何子文件夹和文件)vlc.exe
:
虽然我可以提供一个脚本来对整个内容进行符号链接,但我认为这没有必要,因为这几乎是一种徒劳的方法。