一 概述
在看《从小工到专家-程序员修炼之道》时,看到建议使用Shell,很有感触。在很多时候,通过键盘操作,比鼠标的确会块很多,如果能用好shell命令(或批处理命令) ,的确能节省我们很多的时候,特别是许多经常重复的工作。例如打开浏览器,进入csdn,cnblogs等感兴趣网站这样的工作,很多人会一天会重复许多次,每次重复这样的过程,单调且浪费不少时间,积少成多,浪费的时间很可观,其实可以使用命令行中,“浏览器.exe + 参数”的方式轻松的实现对兴趣网站的访问。其他的常用操作还有很多,例如“打开远程连接”,“通过VS2010打开自己最近在工作的项目”,“打开服务程序”,“打开常用文件夹”,使用自己常用的工具。
二 问题
如果都使用shell命令(或批处理命令),通过键盘进行这些操作,肯定会快的多。但是这些命令复杂而且不容易记住,怎么办?
我简单的列举了一下使用命令会遇到的问题,并在后面一 一进行解决。
1: 如何方便的打开命令行工具?如何轻松的实现输入命令?
2: Shell命令(或批处理命令)这么复杂,不容易记住。
3: 执行一个命令要输入太多代码,不比直接代开快。
4: 是否可以很轻松的添加自己的命令
三 使用场景
根据自己的理解,我通过批处理实现了一个使用命令行快速执行命令的程序。
我的程序叫XBAT,在开机时自动运行。XBAT的界面为一个可见的文本框,位于左面的右上角,占据很小的位置(见下图红色标出部分)。
使用场景:
1: 用户想用浏览器打开百度网站时,同时按下“Win + Z”键,XBAT文本框获得焦点
2: 用户输入“bd”,按下Enter键。
3: 浏览器打开百度站点。
现在这个程序我自己用起来得心应手,没有这个程序,我感觉很不方便。
我现在常用的是用它来打开iis,打开“服务”,打开“DEPENDS.EXE”,打开自己常用的文件夹,常用的sln,打开命令行,打开常用站点,常用文件夹。
四 实现
使用就是这样简单。
实现也不复杂。
1:XBAT中,捕获“Win + Z”快捷键,不管你在干什么,知道按下这组快捷键,就会将焦点设置到XBAT的文本框中。MFC的实现代码为:
static const long g_HotKeyCMD = WM_USER + 1;
::RegisterHotKey(this->m_hWnd, ::g_HotKeyCMD, MOD_WIN, 'Z');
BEGIN_MESSAGE_MAP(CXBATDlg, CDialog)
ON_MESSAGE(WM_HOTKEY, OnHotKay)
...
END_MESSAGE_MAP()
LRESULT CXBATDlg::OnHotKay(WPARAM wParam, LPARAM pParam) {if (wParam == ::g_HotKeyCMD){// ...return 0;}//...return 0; }
2: 用户输入命令,按下Enter键后,XBAT会以用户输入命令为参数调用一个批处理run.bat
BOOL CXBATDlg::PreTranslateMessage(MSG* pMsg) {this->UpdateData();if(pMsg->wParam == VK_RETURN){static CString batPath = "";if (batPath == ""){CString strAppPath;CXBATDlg::GetAppPath(strAppPath);batPath = strAppPath + "MyBAT\\run.bat";}::ShellExecute(this->m_hWnd, "open", batPath, this->m_CMD.GetBuffer(), NULL, SW_HIDE);this->m_CMD = "";this->UpdateData(FALSE);return true; }return CDialog::PreTranslateMessage(pMsg); }
代码中的m_CMD为空户输入的命令
3: run.bat的工作原理:
run.bat会根据用户输入的bd,知道是要访问百度网站,就找到浏览器的exe文件,以百度地址为参数,调用浏览器命令,实现打开网站的操作。
if %1==bd (start /max "C:\...\360se.exe" "www.baidu.com" )
4: 对run.bat进行重构
1) 我们需要打开的站点有很多,所以需要将打开浏览器的代码抽象出来,我的做法是把这些批处理放置到单独的文件“openurl.bat”中。
代码成了
if %1==bd ( call openurl "www.baidu.com" )
2) 将要打开的网站和类似的“bd”命令放置到一个文件中单独配置,这个文件叫“store.txt”。
除了能打开网站以外,还需要能打开一些exe文件,打开文件夹,打开VS的sln。也就是说要针对多种操作类型,需要对操作类型进行定义:
s: 打开sln(使用vs2010,提供一个opensln.bat批处理,里面代码:
start "C:\...\VSLauncher.exe" "%1"
)
u: 打开网站(使用浏览器,使用openurl批处理,里面就一行代码:
start /max "C:\...\360se.exe" %1
)
o: 对象文件,直接执行(提供一个openexe.bat批处理,里面就一行代码:
start "" %1
)
f: 打开文件夹(提供一个openfolder.bat批处理,里面就一行代码:
start %1
)
后来有添加了打开pdf什么的。
run.bat的批处理就需要修改为:
set found=0 @echo off&setlocal enabledelayedexpansion for /f "tokens=1,2,3 delims= " %%i in (store.txt) do (if %%i==%1 ( set p=%%j&set p1=!p:#p#=%path%!&set p2=!p1:#f#=%folder%!&set p3=!p2:#s#=%SystemRoot%!if %%k==s (call opensln !p3!)if %%k==f (call openfolder !p3!)if %%k==u (call openurl !p3!)if %%k==o (call openexe !p3!)echo 找到选项 %%kset found=1) )
store.txt的内容如下:
kfgj E:\开发工具 f gjrj E:\工具软件 f dzs E:\电子书 f bd www.baidu.com u cbs http://www.cnblogs.com u csdn www.csdn.net u a http://localhost/admin u h http://localhost/ u 126 www.126.com u wk http://wenku.baidu.com u rz F:\.../...xls o ss F:\...\.....sln s
说到这儿,就有一个我头疼的问题,在store.txt中,我无法在诸如“:\开发工具”中包含空格,不知道有没有人知道怎么处理?
在run.bat中,还有一些操作不能包括在这几种操作中,只好单独处理了,特别是带参数的。(javascript中有REPL,不知道批处理中是否也可以这样,如果可以,就能防止在store.txt中了)
if %found%==1 (goto start ) if %1==iisreset (start iisresetgoto start ) if %1==iis (start C:\WINDOWS\system32\inetsrv\iis.mscgoto start ) if %1==fw (start %SystemRoot%\system32\services.msc /sgoto start ) if %1==yc (start %SystemRoot%\system32\mstsc.exegoto start ) if %1==jsq (start %SystemRoot%\system32\calc.exegoto start )
五 结束
除了这些功能外,我还添加了按“win+C”打开“store.txt”文件,按“Win+V”打开XBAT的文件夹。
XBAT的不足有:
1: 虽然软件界面很小,但是还是存在,而且是在界面的顶层,特别是播放视频的时候,看着不舒服。
2: 在store的文件夹等路径中,不能包含空格。
3: 有时候会被360认为有危险。
4: 添加新的命令不方便,需要打开store.txt自己动手添加
5: 暂时XBAT只接受简单的指令,无法输入带参数的指令,例如查找文件等
源代码下载地址:
http://download.csdn.net/detail/xumingxsh/7801215
Release版下载地址:
http://download.csdn.net/detail/xumingxsh/7801733