代码改变世界

一个简单的WSH Scriptlet

2012-05-26 20:59  Nana's Lich  阅读(637)  评论(0编辑  收藏  举报

先强调一下,我这里把它称为“Scriptlet”只是因为和其字面意义比较近似,并不是指 Microsoft Windows 中的那种“脚本组件”。

起因

有些时候我会弄到一些免安装的实用工具,比方说 Sysinternals 套件中的工具就都属于这一种。

但是虽然工具是免安装的,可实际用起来的时候找到工具的所在位置也挺麻烦的,所以我尝试过几种办法,有创建快捷方式、创建文件夹、设置 Path 环境变量等等,总地来说当这类五花八门的免安装工具越来越多的时候,我是会犯懒的,于是我就开始想有什么办法可以一劳永逸地解决这个问题。

解决方案

经过短时间的尝试以后,我最终写出了一个能有点帮助的 Scriptlet,语言为 JScript,完整代码如下:

function print(s){
  WScript.Echo(s);
}

function installScriptlet(){
  var sh = new ActiveXObject("WScript.Shell");
  var env = sh.Environment("Process");
  var installPath = env("AppData");
  if(!installPath)
    installPath = sh.SpecialFolders("MyDocuments");

  var fso = new ActiveXObject("Scripting.FileSystemObject");
  installPath = fso.BuildPath(installPath, "Scriptlet");
  if(!fso.FolderExists(installPath))
    fso.CreateFolder(installPath);

  installPath = fso.BuildPath(installPath, WScript.ScriptName);
  fso.CopyFile(WScript.ScriptFullName, installPath);

  var kucr = "HKCU" + "\\Software\\Classes\\";
  var verbKey = kucr + sh.RegRead("HKCR\\.exe\\") + "\\shell\\RegAppPath\\";
  sh.RegWrite(verbKey, "Register Application Path");
  sh.RegWrite(verbKey + "command\\", '"' + WScript.FullName + '" "' + installPath + '" "%1"');

  print(WScript.ScriptName + " installation successful!");
}

function registerAppPath(appPath){
  var fso = new ActiveXObject("Scripting.FileSystemObject");
  var fn = fso.GetFileName(appPath);

  var kuap = "HKCU" + "\\Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\";
  var sh = new ActiveXObject("WScript.Shell");
  sh.RegWrite(kuap + fn + "\\", appPath);
  sh.RegWrite(kuap + fn + "\\Path", fso.GetParentFolderName(appPath));

  print("Path set for " + fn + " !");
}

var args = WScript.Arguments;

if(args.Length < 1)
  installScriptlet();
else
  registerAppPath(args(0));

使用方法很简单,首先得把这些代码保存在一个纯文本文件中,扩展名应为“.js”:

然后双击刚刚保存的这个文件,就会出现这样的提示:

现在 .exe 可执行文件的快捷菜单中就会多出来一个菜单项:

当点击这个菜单项以后,会出现这样的提示:

从此以后只要在"运行"对话框(快捷键为Win+R)中输入"Your Application"就可以直接运行 Your Application.exe 了:

而不用特别指定路径,或是自己用资源管理器去把可执行文件找出来。

答疑

可能我在开头说的"一劳永逸"会让一些人感到困惑:

这好像也没方便到哪去啊,而且每个可执行文件都要这么搞一次,也不比直接改Path好嘛。

实际上它是这么回事:

只有像 Sysinternals 这样的实用工具套件才比较适合用改 Path 的办法,而大部分的免安装工具都是一个两个可执行文件就作为一个产品发布出来了,很多时候不同的产品可能还会有些名字相同的文件,这样你就不能把它们都放在同一个目录中,如果设置 Path 的话得对每一个这样的产品都这样做一次;而且有些比较特殊的情况,比方说当你的 Windows 中同时安装了多个版本的 .NET Framework 时,你肯定不会希望将其中的一个或者多个都设置到 Path 环境变量中,因为那可能会引发一些难以预料的事情。

最后,即使用修改 Path 的方式能把上述问题都解决掉,可是如果因为某种原因需要重装 Windows 呢?可能重装一次之后我们还能隐约想起以前是怎么设置的了,那么再一次重装之后呢?以后还会每次都这样设置吗?

从我拥有自己的电脑以来到现在已经有十多年了,而这十多年使用电脑的经历中,重装 Windows 之后"懒得去折腾"算得上是高概率事件了,所以我把这种操作放在一个脚本工具里,这样就算重装 Windows 之后没有马上去设置这些免安装工具,但当第一次因为要使用某个工具而用资源管理器打开相应的文件夹时,只要轻击鼠标右键,就可以很方便地为这个工具配置好路径了。

而这个脚本工具本身,只要放在一个容易找到的地方,就算我自己再懒,每次重装 Windows 以后运行一次也还是做得到的。

我所谓的“一劳永逸”就是这个意思。

 

注:

这个脚本工具在编写的时候只在 Windows 7 上测试过,后来检查相关的技术资料发现可能在 Windows XP 和 Windows Vista 上不能正常工作,如果使用过程中发现了这样的问题,只需要把“HKCU”改成“HKLM”即可。