一 概述
在看《從小工到專家-程序員修煉之道》時,看到建議使用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