很多的软件工具,使用中需要用绝对路径。
先说一下对软件的便携化,我曾经使用的两个方案:
方法一、虚拟盘符
使用 subst 命令
首先在U盘某个文件夹下建立一个bat文件,内容为
@ECHO OFF
subst X: %~d0\xxx\yyy
----------------------
上面的 %~d0 是获取bat所在盘符
xxx\yyy 替换成自己U盘上的文件夹
上面的bat文件运行之后,系统会多出一个虚拟盘符 X:
U盘里面的软件,都用X:开始的路径来调用
这种方法的弊端主要在于,自己电脑上的软件和U盘的软件配置同步不太方便
为了免于修改之苦,在自己电脑上也用虚拟盘符来配置软件,结果带来别的一些麻烦
但文件夹结构改变时,需要更改不同的配置文件
方法二、nircmd
用 ~$folder.nircmd$ 获取 nircmd 自身路径
使用格式:
nircmd execmd ~$folder.nircmd$\plugin\xxx.vbs
这种方法会让命令变得很长,而且使用了一个外部程序,理论上,会使得命令的运行慢一点点。
不过为了便携化,我忍了。
在hoekey里面,我一直在用nircmd方法来配置软件
但是随着我对strokeit使用的深入,发现strokeit在调用外部程序的时候,竟然不支持相对路径!
也就是说,在运行程序这栏,必须使用绝对路径
你可以试试直接写 CMD.exe,这是不行的,当然,我们可以写环境变量 %ComSpec%
可执行文件还能用\前导的路径解决
如果是要开TXT文本,strokeit就要在文件栏写 程序文件绝对路径,参数写TXT文本的绝对路径
上面nircmd的例子,strokeit必须要在文件栏写全路径,以\和..前导,可以运行,但是当涉及到比较复杂的路径传递时,就不是很靠谱,如果参数栏里面需要绝对路径,可能会导致调用的程序出错
而且~$folder.nircmd$方法必然要固定文件夹的相对位置,当文件夹位置改变的时候,修改起来比较麻烦
最后说一下我现在使用的
方法三:环境变量继承
我的目录结构:
..\hoekey\hyhoekey.bat
..\strokeit
hyhoekey.bat 内容
-----------------------------------------
@ECHO OFF
set "hoekeyDrive=%~d0"
set "hoekeyFolder=%~dp0"
cd /d "%hoekeyFolder%"
set "hoekeyFolder=%cd%"
set "hoekeyplugin=%hoekeyFolder%\plugin"
set "path=%path%;%hoekeyFolder%"
cd..
set "ToolsFolder=%cd%"
set "StrokeItFolder=%cd%\strokeIt"
cd %hoekeyFolder%
start "" "%hoekeyFolder%\hoekey.exe"
start "" "%StrokeItFolder%\strokeit.exe"
exit
-------------------------------------------
稍微解释一下,%~d0是bat所在盘符,%~dp0是bat自身路径
用 %CD% 再次赋值 是为了去掉 %~dp0 最后那个 \
最后要用start调用程序,不使用start会卡住
上面的bat可以自己根据需要修改,加上AHK、EV、TC什么的
该bat启动的程序,都将继承新设定的的环境变量,并且,这些程序调用的程序,也都能够继承
这种方法可以让所有的程序都获得环境变量,只要程序支持环境变量,就可以很方便地获取绝对路径
这种方法不会影响系统环境变量,只影响自己的子进程
只需要修改一个bat,就可以控制所有程序的路径调用
即使文件夹结构发生很大变化,也能很方便地修改
使用这个bat,会有个cmd黑框一闪而过,如果很介意的话,可以用nircmd或者vbs调用隐藏运行。
前面的例子
nircmd execmd ~$folder.nircmd$\plugin\xxx.vbs
用环境变量继承来写:
WScript.exe %hoekeyplugin%\xxx.vbs
最后是strokeit调用vbs的例子: