.lnk 快捷方式中的环境变量

.lnk 快捷方式中的环境变量

我想创建一个 Windows 快捷方式,javaw.exe可变目标. 这个目的地是我的系统环境变量的内容%MY_OWN_JAVA_HOME%

我尝试过这样做:

  1. 右键单击文件夹(使用 Windows 资源管理器)
  2. New=>Shortcut
  3. 目的地:%MY_OWN_JAVA_HOME%\bin\javaw.exe -cp ......
  4. NextFinish

问题是,环境变量是创建时计算。当我打开此环境变量的设置时,当前的使用该变量的值。

我如何将变量保留为快捷方式的目的地?

答案1

您仍然应该能够使用 VBScript 或 powershell 中的 COM 对象创建具有环境变量的快捷方式。方法“创建快捷方式“(更多细节也适用于参数)这里) 可以做到这一点。虽然最初是一个 vbscript 解决方案,但您可以从 powershell 提示符中调用它,如下所示:

$WshShell = New-Object -comObject WScript.Shell
$Shortcut = $WshShell.CreateShortcut("C:\Users\Public\Desktop\My Java Shortcut.lnk")
$Shortcut.TargetPath = "%MY_OWN_JAVA_HOME%\javaw.exe"
$Shortcut.Arguments = "-cp"
$Shortcut.Save()

请注意,参数不会进入目标路径。如果您的环境变量包含空格,它也可能不起作用。这样做的好处是您确实有一个真正的快捷方式而不是一些包装器,缺点是您永远无法通过其属性对话框更改此快捷方式。一旦您这样做,变量就会再次被替换。

如果你想要一个包装器,我建议你使用一个完全无声的 vbs 文件。创建一个新的文本文件并粘贴以下行

CreateObject("WScript.Shell").Run """%MY_OWN_JAVA_HOME%\bin\javaw.exe"" -cp", , False

在那里,将其保存为“runmyjava.vbs”,然后创建该文件的快捷方式,这样它就不会出现黑色弹出窗口,哪怕是一瞬间。请注意可执行文件路径后面的额外“”。只有当环境变量包含空格时才需要这些。

答案2

一个解决方案是使用.lnk在 Windows XP 中创建的快捷方式文件。这些快捷方式会将您的变量保留在快捷方式目标中 - 即使您更改了目标。


另一个解决方案是,正如@DavidPostill 在评论中所建议的,使用如下批处理文件作为快捷方式目标:

@echo off
start "" "%MY_OWN_JAVA_HOME%\bin\javaw.exe" %*

然后在快捷方式选项中选择“最小化”。

该解决方案工作正常,但会打开一秒钟最小化的 cmd 弹出窗口。

答案3

建立一个快捷方式,其中“目标”是“cmd /k”,运行“start "" /B”来运行您的应用程序。

命令处理器 (cmd) 将解析环境变量并在 Start 完成后关闭。Start 将“不带”窗口运行应用程序(尽管它仍然闪烁)。

笔记:

  • 命令希望程序 (启动) 和程序的参数只有一个参数
  • 开始希望为程序和程序的参数提供单独的参数
  • %CD% 将解析为快捷方式的“起始于”路径。清除 %CD% 的“起始于”即可解析为快捷方式的路径。
  • 如果目标命令行对于 Explorer/WshShell 来说太长,您将需要使用另一个库(例如 liblnk)构建快捷方式或回退到调用单独的批处理文件。
cmd /k "<<START COMMAND>>"

cmd /k "start "" /B "<<PROGRAM>>" <<PROGRAM ARGUMENTS>>"

cmd /K "start "" /B "%MY_OWN_JAVA_HOME%\bin\javaw.exe" %*"

答案4

我想建议另一种解决方案,它在 Windows Vista 中有效,尽管我不知道它是否适用于较新的 Windows 版本:根据我的经验,对 .lnk 文件进行写保护将始终阻止目标/目标变量被扩展。它们通常在创建 .lnk 时(或使用时)被扩展,但可以在使用 .lnk 之前(下次)通过对 .lnk 进行写保护来重新插入并维护它们。

相关内容