admin管理员组

文章数量:1546098

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               


(版权所有,转载请注明)

Gavin Chou

2011-11


摘 要:本文介绍了通过分析windows快捷方式扫描目录以及使用脚本语言结合批处理命令创建快捷方式的方法达到在“开始”菜单“运行”选项里输入自定义 “命令”实现通过输入命令的方式打开/运行任文件(程序、文件及文件夹)。使用此种方法能够最大化缩短寻找程序、文件的时间,从而大大提高使用电脑学习、 工作的效率。

关键词:Windows;注册表;运行;快捷方式;系统目录;BAT;VBS;命令

An Implementation of Custom “command” in Windows’ “Run” dialog

Gavin Chou

Abstract: (This paper is not formal, the abstract in English is omitted)

Keywords: Windows; registry; Run; Shortcut; system-root-directory; BAT; VBS; Command


1  引言
如果对本文过程不感兴趣,可以直接跳到第4章(结论)。

本 文是作者对自己于2009年写的一个程序(应该叫脚本更加合适)的一个总结,涉及到了Windows的注册表、快捷方式、VBS脚本语言、批处理命令等内 容,也提到了使用Windows功能的一些小技巧,在此和大家分享。本文面向的读者为:1、对Windows有兴趣的;2、对Windows系统结构有一 定了解的;3、对BAT或VBS感兴趣的; 

Windows出来已经有一些年头了,自从有了Windows后人们就能够通过操作鼠标很方 便地完成大量的操作,不必再像DOS时代每个操作都需要用键盘敲命令来实现。但是,随着操作系统的不断升级,系统变得越来越聪明,越来越多的操作依赖于鼠 标来实现,操作者对系统现成的功能也越来越依赖,操作虽然方便了,但是操作的效率是否就非常高了呢?作者认为并不是这样的,很多时候键盘的操作效率比鼠标 要高的多(打DOTA就是一个很好的例子,如果使用鼠标来施放技能,那么估计就被杀成鬼了……)。写过程序的人都知道,一个东西封装程度越高,那么它使用 起来就越方便,但是同时它的限制就多了,灵活性也就越差,矛盾总是存在的,操作系统(某些方面)也一样。举个例子,有人在使用电脑做工程/项目时,需要使 用很多软件,参考很多资料,那么就需要不断打开很多窗口,窗口多时还要关闭一些窗口,假设这些东西都能够在桌面(当然是Windows的桌面)找到,那么 要打开一个文档或程序就要返回桌面一次,寻找->打开,如果资料还不都在桌面上,那么还要深入到某个目录下寻找……这些操作可以通过操作鼠标和键盘 组合来实现,但大都是重复而浪费时间,这些重复而浪费时间的事应该让不会思考的电脑完成,我们需要做的事就是告诉电脑我们想做什么---输入命令,然后我 们就能打开想打开的东西,就像输入“记事本”,电脑就打开一个记事本;输入“工具”,电脑就打开我们常用工具所在的文件夹;输入“给我放首歌”,电脑就播 放一首歌(放首什么歌呢?把歌名作为参数就可以了。说到这个,顺便给读者讲个笑话:一个好程序员是不会写一个“摧毁地球”的函数的,他只会写一个“摧毁行 星”的函数,而把地球作为它的参数……),命令是自定义的,就不需要为记住命令而花不必要的时间,重复操作的时间就省下来了。
摘要所描述的可能有 些抽象,不过也总结了本文想要介绍的内容。可能对于对window了解不是很深入的读者还是不太清楚摘要中所描述的功能,那么接下来作者再举个例子吧。很 多人都看过《钢铁侠》这部电影,电影里有一幕给作者的印象特别深刻,那就是Stark的助理在公司办公室的电脑上看到了Stark被匪徒绑架后要挟公司高 层的录像,助理不知道匪徒说的是哪国语言,于是调出来个小对话框,输入“Translate”(不包括引号……),匪徒说的鸟语就变成了英语。作者在摘要 里描述的功能就是类似Stark的助理输入“Translate”的功能,当然,《钢铁侠》是个科幻电影,所以本文所要阐述的功能并没有电影里的那么强 大,只是类似(但是,相信在未来10年内就能实现了,而且还是可以是声控的!),就向电影里的一样,能够让电脑(Windows)的操作者省去找来翻译软 件这种繁琐而浪费时间的动作。当然,初期设置是必须的,本文从第2章开始就会提到如何实现。

本文所描述的功能均在Windows XP 下实现,其他版本的Windows用户可以参考借鉴,文中也会提到应付不同版本Windows的方法。


2  功能的实现
2.1  开始->运行功能的引入
会使用“开始->运行”的可以直接跳到2.2节。

首先,让我们来做几个实验:1、单击开始菜单里的 “运行”项(这就是我们通常所说的“开始->运行”,在Windows7下开始菜单的那个搜索输入框也有同样的效果,按住Windows徽标的同时再按“R”键也能够调出“运行”对话框,Windows徽标和R键是作者用得最多的按键),


输 入“notepad”(不包括引号),回车,如果不出意外的话读者应该会打开了一个记事本的窗口,要用记事本来做什么事情,读者自己决定。2、同样在运行 的小对话框里输入“winword”,如果读者的电脑安装有office套件的话,那么(从名字就能看出来)应该就能打开我们常用的word了……除此之 外还有很多我们能够打开的东西,包括一些系统工具,在运行对话框里输入:CMD.EXE(命令行),control(控制面板),explorer(我的 文档)等等(标准系统的工具,这些工具的使用也是大有学问,但不是本文主要内容,如果有时间的话,作者再进行一些使用经验的总结)。但是,有读者可能会去 尝试输入“powerpoint”了,当然得到的结果就是
 


这又是为什么呢?既然word可以,excel可以,为什么powepoint就不行呢?在下一节中读者就可以得到答案。


2.2  “运行”对话框的浅析

经 过作者的不断摸索和总结,对“运行”对话框有了一定的了解。“运行”对话框里输入的命令又是什么呢?---废话,当然是程序!那么这些程序又是从哪里来 的?---废话,系统自带或是安装程序是自动安装生成的!那么这些程序又是在什么地方(哪些目录下)呢?---这……就不太清楚了吧……那么让我们来使用 一下在使用计算机是经常用到的查找方法---反向查找法来找到答案吧!就从“notepad”开始,既然说是系统自带的,那么就到系统所在的盘符查找(使 用Windows的搜索功能会吧?)好了,如果你有耐心那么就等吧。作者在此告诉你答案吧,notepad在windows的根目录下,notepad的 完整地址也就是c:\windows\notepad.exe,而CMD.EXE的完整地址也就是c:\windows\system32 \cmd.exe,当然,作者在之前提到的control和explorer等等系统工具都在这两个目录下(但是在这两个目录下是找不到 winword.EXE这个东西的,为什么呢?在2.3节会给出答案),windows根目录下的其他文件夹(除了system32)中的程序都不运行。 读者可以做一下这两个实验:1、在Windows根目录(C:\windows\,往后用统一称为%windir%,系统安装在不同的盘符Windows 的根目录则不一样,只是C\D\E\F的差别而已,另外,Windows路径不区分大小写)下新建一个文件夹,然后往里边放一个程序,然后在“运行”对话 框里输入程序名,试试看能不能启动该程序;2、直接将一个程序在%windir%,然后在“运行”对话框里输入程序名,试试看能不能启动该程序。那么以上 废话总结为:“运行”对话框只对%windir%和system32目录的程序名进行扫描匹配,如果存在则运行,否则“嘭”一声一个大红叉叉。


2.3  “运行”命令的扩展,实现自定义“命令”

到 此,可能有读者就会问了:“我知道这个又有什么用?我总不能把我想要用命令形式来打开的软件都裸奔地放在%windir%下吧!?”这个担心确实是很有道 理的,会使用C\C++来写一些小程序的读者在知道这个扫描路径后可能会自己开发一些小程序来放在%WINDIR%下玩玩,但是这样用途还是有限的。有没 有一种能够不需要将程序放在%windir%下,而且有能通过在“开始”输入命令来对其进行调用(打开)呢?办法是有的,经过作者两年前的不断摸索,总结 出了两种方法。


2.3.1  通过修改注册表实现自定义“命令”
这 也是一些工具软件让用户在“运行”对话框实现快速启动的方法,作者见身边的人用过,所以分析(在别人的电脑上干的)了一个这种软件的行为和实现方法,结合 网上查找的资料,也就总结了这个方法。在“运行”中输入  “regedit”(不带引号)并运行,然后按照“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows \CurrentVersion\App Paths”依次展开左边的文件夹,如下所示

 


在“App Paths”项下就可以看到很多以“.EXE”结尾的子项,其中包括


等 等,读者看到winword.exe了吧,那就是为什么我们在%windir%和system32目录下都找不到winword.exe而有能够通过“运 行”对话框来打开word的原因了。读者可以从中选一个“App  Paths”子项中的文件名在“运行”中输入运行试一试,保证都能够运行。其中子项的键值就决定了该程序的路径,以作者的firefox为例:
 


默 认键值的数据就是可执行程序的完整路径(包括所在文件夹和程序名),Path键值的数据就是可执行程序所在文件夹。那么,这个思路就很清楚了,如果需要添 加自己的程序(eg. D:\TEST\AAA.EXE)就在“App  Paths”项下新建一个子项“AAA.EXE”(不包括引号),然后在修改“AAA.EXE”项下的(默认)键值的数据为“D:\TEST \AAA.EXE” (不包括引号),新建一个名为“Path”REG_SZ类型的键值并修改其数据为“D:\TEST\”  (不包括引号,下文中不再强调,如果需要加入引号,会做特别说明)。
虽然这样能够在“运行”对话框输入程序名称来运行自己的程序,但是每添加一个 程序就要修改一次注册表,打开注册表还要翻半天才找到“App  Paths”,这是苦力活,这是电脑应该做的事情,明显不能让人来干!那么怎么解决呢?---批处理命令、vbs都可以,作者此处不给出详细的代码(因为 接下来要介绍更好的方法),只是提供一个脚本的编写思路(有很多种方法的)给会使用BAT或者VBS的读者进行实践(以BAT为例):将要在注册表里 “App Paths”注册的程序作为参数(%1)传递给BAT脚本,使用 ~dpnx 和 ~dp  将程序完整路径和程序所在文件夹提取出来,然后使用REG ADD命令将提取的信息导入这册表就可以了。

接下来谈谈修改注册表来达到通过“运行” 对话框快速打开程序的弊端,打开程序是没有问题了,那如果要经常打开一个文件夹呢?如果我们照搬前边在注册表里注册程序的方法,那么在“运行”里输入文件 夹名字的时候无疑就会“嘭”一声,然后一个红叉叉!原因很简单,“App  Paths”目录下只存放可执行程序的路径,而文件夹不是程序……那要打开文件夹怎么办呢?不急,接下来说。


2.3.2  通过在%windir%下创建快捷方式实现自定义“命令”
这 是作者在2009年的某一天,瞎逛%windir%(以前很喜欢逛这个地方,微软给力,支持Windows,支持微软!)时摸索出来的,操作比前边的注册 表简单的多,而且最主要是能够打开指定的文件夹!很多读者可能已经猜到改怎么做了,对,就是将一个程序或这文件夹的快捷方式放到%windir%下,然后 在“运行”对话框中输入快捷方式的名称(不需要后缀,后缀的问题,接下来会提到),回车!怎么样?不错吧!在此,作者顺便向读者介绍一个Windows操 作使用鼠标和键盘组合(鼠标和键盘操作也是大有学问的,有时间作者也会整理出一片文章和大家分享)来创建快捷方式的一个小技巧:按住Alt键,然后用鼠标 拖拽(按住左键移动鼠标)需要创建快捷方式的目标(可以是任何文件),如下图所示:
 


所以就可以使用这种方法创建快捷方式了,将需要在%windir%下创建快捷方式的目标按住Alt后拖拽到%windir%下,然后改快捷方式的名字就可以在“运行”中用命令的形式调用了(这里就不需要上图了吧?)。
现 在来谈一谈后缀名的问题,如果自己创建的快捷方式和系统工具的默认名称重复了这么办?作者做了试验,将两个文件名字一样,但是后缀不一样(例如 AAA.EXE和AAA.LNK)的文件放在%windir%下,在“运行”输入AAA,那么系统默认运行AAA.EXE,因为EXE的是AAA的默认后 缀名,其他文件后缀作者就没有做过比较,读者可以亲自验证。

好了,现在又有一个问题了,如果每次要在%windir%创建一个快捷方式,那么就要 打开%windir%一次,虽然不想修改注册表那么麻烦,但这些都是重复的工作应该让电脑来做这些工作,我们希望的是点点鼠标输入个想要的命令名就能够在 “运行”对话框中输入自己的命令了,如何实现?在第3章中作者会给出完整的解决方案。


3  进一步简化在%windir%下生成快捷方式的操作
3.1  简化在%windir%下生成快捷方式操作的探索过程
如果读者对探究过程不感兴趣,可以直接跳到3.2节。
如果读者是Windows用户,那么相信读者一定都用过右键菜单里的“发送到”这个功能吧?
 


“发 送到”选项里边有一个“桌面快捷方式”选项读者可能经常用吧,那么有这么个思路,既然能够发送到桌面快捷方式,那么能不能发送到%windir%快捷方式 呢?经过作者的不断探究,得到的答案是肯定的。探索的过程相当繁琐而漫长,花了两、三个星期的时间才完成了从解析文件路径到基本成型的脚本,篇幅有限,不 赘述过程,只阐述结果。读者看到的发送到选项其实是一个文件夹(此文件夹默认隐藏),文件夹的位置是“%userprofile%\sendto”(在 “运行”对话框中输入“%userprofile%\sendto”就可以打开了,运行中打开后就可以看到“发送到”的文件夹具体位置 了)。%userprofile%又是什么东西?它和%windir%一样,是一个系统的环境变量,当然这又是另外一个话题了,也是很有用的东西。

那 么,找到了地方就好办了,里边都是类似快捷方式的东西(0字节!),按照前边的思路,和SendTo文件夹里的东西,如果我们在这里放一个文件夹的快捷方 式会这么样?---对的,如果我们对一个文件使用修改后的“发送到”,然后指向我们扔到“SendTo”文件夹的快捷方式,那么结果就像向我们平时往U盘 里发送(其实是复制)文件一样,只是文件复制到了我们设定的文件夹的位置。那这又有什么用呢?我们要发送的是文件的快捷方式到%windir%,又不是文 件本身---当然有用!看到“桌面快捷方式”这个东西没?它没有看执行代码(0字节),但是它指向一个可执行程序,那么如果我们在SendTo文件夹里放 一段脚本或程序什么的就可以对我们点击的文件进行操作了!会使用BAT的读者可能就知道,当我们点击一个文件时,其实就得到了一个参数---%1,这个参 数就是当前所点击的文件的路径信息,对%1进行操作就可以实现在%windir%下创建%1的快捷方式了。具体如何实现,作者就不在此赘述了,提供一个思 路,然后给出全部代码(人不需要做重复的活,重复的活让电脑干):BAT不能直接创建快捷方式,所以我们需要能够创建快捷方式的脚本---VBS,而 VBS实现参数传递有不如BAT那么方便(准确的说应该是作者的VBS学艺不精吧),所以就将BAT和VBS结合起来,使用BAT得到参数,再用BAT生 成创建快捷方式的VBS脚本,运行VBS脚本,完工(其中很多步骤的省略了,感兴趣的读者可以分析一下实现代码)。


3.2  简化在%windir%下生成快捷方式操作的批处理文件代码
将 以下给出的代码完整地复制、粘贴到一个记事本(notepad)中,然后另存为,文件名为“SendToWindir.bat”---注意后缀 名.BAT,再双击运行刚才保存的SendToWindir.bat,如果运行成功那么就会在“%userprofile%\sendto”生成一个同样 名字的文件。读者右击某个文件,然后就可以在“发送到”选项里看到多了一项“SendToWindir”。使用方法和“发送到”->“桌面快捷方 式”的操作类似,只是多了个输入名称的过程,看提示就会了,将一个文件的快捷方式发送到%windir%后就可以在“运行”对话框输入对应的名称来打开文 件了,程序、文件夹或文档都可以。源码如下:
rem SendShortcutToWindir
@echo off
color 17
cls
:copy this batchfile to SendTo directory of the user
cd /d %userprofile%\sendto
if not exist %~nx0 (
echo batchfile does not exit, copying file to %userprofile%\sendto\ ...
copy %0 "%userprofile%\sendto\%~nx0"
:type %0>"%userprofile%\sendto\%~nx0"
echo Done! Now, exit this program and check the SendTo options of right-click menu
pause
exit
)
echo.
echo.
title SendShortcutToWindir
echo                             ************************
echo                               SendShortcutToWindir
echo                             ************************
echo            **********************************************************
echo            *                    designed by Gavin                   *
echo            *         created time:2009-11-10 星期二 14:58           *
echo            *                   all rights reserved                  *
echo            **********************************************************
:set path=%~dp1
:echo %path%
cd /d %~dp0
:********key statement to resolve the violation of quotation marks in the path *****
set str="%~dpnx1"
:***********************************************************
echo %str%
set name=%~n1
echo default name: %name%
echo input the shortcut name:
set /p name=
set ShortcutTargetPath=%str%
:************change this parameter can make it different...*********************
set ShortcutPath="%windir%\%name%.lnk"
set IconLocationPath=%str%
:***********the Icon of the created shortcut is the Icon of the target file.************
set HotKey=""

echo Set WshShell=WScript.CreateObject("WScript.shell")>WindowsShortcut.vbs
echo Set Shortcut=WshShell.CreateShortCut(%ShortCutPath%) >>WindowsShortcut.vbs
:situation1
:***********with quotation marks in %1
echo Shortcut.Hotkey = %HotKey% >>WindowsShortcut.vbs
echo Shortcut.IconLocation=%IconLocationPath% >>WindowsShortcut.vbs
echo Shortcut.TargetPath=%ShortcutTargetPath% >>WindowsShortcut.vbs
echo Shortcut.Save >>WindowsShortcut.vbs
"%SystemRoot%\System32\WScript.exe" WindowsShortcut.vbs
:pause
del WindowsShortcut.vbs /q /f
echo Done!
exit

:situation2
:***************without qoutation marks in %1
echo Shortcut.Hotkey = %HotKey% >>WindowsShortcut.vbs
echo Shortcut.IconLocation="%IconLocationPath%" >>WindowsShortcut.vbs
echo Shortcut.TargetPath="%ShortcutTargetPath%" >>WindowsShortcut.vbs
echo Shortcut.Save >>WindowsShortcut.vbs
"%SystemRoot%\System32\WScript.exe" WindowsShortcut.vbs
:pause
del WindowsShortcut.vbs /q /f
echo Done!
exit

如果使用缺省名称(当前文件名,不包括后缀)的话,直接回车即可。如果“

本文标签: 自定义命令Windows