比如说,我要wget
在 Windows 上使用。如果我解压 zip 文件,它会有很多依赖项(dll 等)。现在,如果我要将符号链接wget.exe
(使用mklink
)到我的桌面(我尝试过使用符号链接和硬链接),它仍然无法工作,除非将必要的 dll 也放在桌面上/也将其符号链接到桌面。有没有办法让它从桌面运行,但“看到”依赖项回到它自己的文件夹中?
请注意,如果我要wget.exe
在桌面上创建快捷方式,我可以轻松地从命令提示符中将其调出,并以桌面为位置,并且它可以按预期工作,但我必须运行wget.exe.lnk
。我可以让符号链接像这样运行吗(当然没有.lnk
)?
谢谢!
答案1
还有另一种解决方案;使用批处理文件来调用 exe,而不是使用链接(或以及)。
例如,我有一个文件夹c:\utils\path
,我将所有想要按程序名称运行的单文件 exe 放入其中,而不管路径如何(即,该文件夹在我的%path%
环境变量中;从而避免我必须为每个实用程序添加新目录)。
我有一个应用程序需要来自其本地路径的 DLL(例如make
),但我不想将其所有 DLL 复制到我的c:\utils\path
目录中,因此它位于其默认安装路径下(C:\Program Files (x86)\GnuWin32\bin\
)。
我可以创建一个批处理文件,make.bat
其中包含以下内容;然后它充当 exe 的符号链接:
"C:\Program Files (x86)\GnuWin32\bin\make.exe" %*
即批处理调用 exe,提供其完整路径(因此它在其本地目录中找到 DLL),并传递传递%*
给批处理文件的任何参数()。
该批处理文件可以直接放在我的路径目录下c:\utils\path
;或者可以将其放在与其相关的 exe (C:\Program Files (x86)\GnuWin32\bin\
)旁边,并使用来自我的路径目录的符号链接来定位批处理而不是 exe。
附注:遗憾的是,"%~dp0\make.exe" %*
批处理脚本中的使用不起作用;因为%~dp0
解析的是符号链接的目录,而不是其目标的目录。话虽如此,但这并不是什么问题;因为我们知道 exe 的完整路径,而且它不太可能移动。
答案2
简短回答:不。
需要说明的是,这在以符号链接为常态的 Linux/Unix 中甚至不起作用。在任何命令行环境中,如果二进制文件具有依赖项,则它们必须位于当前工作目录中,或位于 PATH 变量中的某个目录中。
就您而言,您可以将目录硬链接到您的桌面,但在运行 wget.exe 之前,您仍然必须从命令行通过 CD 进入该目录。
唯一的选择是重新编译 wget.exe 并将其静态链接到它所需的 .dll 文件(因为它是开源的)。这样你就不需要那些 .dll 了,而 wget.exe 将成为独立的可执行文件。然而,在 Windows 中执行此操作的步骤有点超出 SuperUser 的范围。