背景:
我喜欢保持计算机整洁。特别是我不喜欢程序和服务随 Windows 一起启动,但我仍然想使用所有程序,而不必手动启动服务和依赖项。合理,对吧?此外,我希望能够通过命令行启动大多数程序。
环境
在我的用户目录中,我有一个 bin 文件夹,其中包含指向相应程序的符号链接(.lnk 文件)(program.lnk 指向名为 program 的程序)。此 bin 文件夹包含在我的环境变量 PATH 中。
如果程序具有依赖项(例如服务),则链接不会直接指向该程序,而是指向位于 bin 文件夹子文件夹中的一个小 BATch 脚本。此脚本启动必要的服务,然后启动该程序。简化后的脚本大致如下所示:
:restart
net start "Nessesary Service"
net start | find "Nessesary Service" > nul 2>&1
if %errorlevel%==0 goto start
goto restart
:start
start program.lnk
exit
program.lnk 位于脚本所在的同一子文件夹中,现在指向要启动的实际程序。但它确实与 bin 文件夹中的初始链接同名。
实际问题:
如果我现在打开“运行”(按 Windows + R)并输入 program(或在 cmd 中输入 program.lnk),它会通过 bin 文件夹中的 PATH 变量找到 program.lnk,按照链接进入子文件夹并执行脚本。脚本启动服务,然后当它到达“start program.lnk”行时,奇怪的事情就开始了。
由于再次执行了相同的脚本,它似乎再次遵循了 PATH。但是,当它到达“program.lnk”行时,它不再使用启动脚本打开另一个 cmd 实例,而是打开子文件夹中的链接,从而启动该程序。
所以我实际看到的只是短暂的两个 cmd 窗口。
我的问题
我的问题当然是为什么。为什么它通过我的 PATH 变量找到链接来打开链接,而不是先查看目录并找到链接 program.lnk?为什么它不对脚本的第二个实例执行相同的操作?我通过任务管理器检查了 CMD 进程的命令行参数,它们完全相同。我搞不懂,任何帮助都非常感谢 :)
编辑
我做了一些测试,结果发现第一个 shell 的当前目录不是 bin 文件夹而是 system32。第二个 cmd 从正确的目录启动,因此启动了该程序。奇怪的是:
仅当初始快捷方式设置为以管理员权限启动(属性 -> 快捷方式 -> 高级)时才会出现这种情况,它需要管理员权限来启动服务。我不知道为什么会这样,但至少这为我解决了问题。我曾经这使脚本本身请求管理员权限而不是通过快捷方式调用。