一 概述

在看《从小工到专家-程序员修炼之道》时,看到建议使用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 找到选项 %%k
set 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 iisreset
goto start
)
if %1==iis (
start C:\WINDOWS\system32\inetsrv\iis.msc
goto start
)
if %1==fw (
start %SystemRoot%\system32\services.msc /s
goto start
)
if %1==yc (
start %SystemRoot%\system32\mstsc.exe
goto start
)
if %1==jsq (
start %SystemRoot%\system32\calc.exe
goto 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

自定义快捷命令程序(VC++加批处理)的更多相关文章

  1. Linux 自定义快捷命令

    Linux中一些比较常用的命令总是重复敲很麻烦,这个时候就可以使用 alias 来自定义快捷命令,用以简化操作.系统会有一些预定义的快捷命令,比如 ll 的效果就和 ls -l 一样. 可以使用 al ...

  2. linux 利用 alias 自定义快捷命令

    例如:alias avi='cd /home/study/goodstudy/goodgoodstudy/english/movie/avi'则后续命令行输入 avi , 就自动执行了  cd xxx ...

  3. vc++ 加载,卸载自己的驱动程序

    用vc++加载自己的驱动程序主要分为以下几个步骤: 1.加载驱动服务 主要要用到以下几个函数 SC_HANDLE WINAPI OpenSCManagerA( __in_opt        LPCS ...

  4. 重新想象 Windows 8 Store Apps (69) - 其它: 自定义启动屏幕, 程序的运行位置, 保持屏幕的点亮状态, MessageDialog, PopupMenu

    [源码下载] 重新想象 Windows 8 Store Apps (69) - 其它: 自定义启动屏幕, 程序的运行位置, 保持屏幕的点亮状态, MessageDialog, PopupMenu 作者 ...

  5. FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑

    FFmpeg_Tutorial FFmpeg工具和sdk库的使用demo 一.使用FFmpeg命令行工具和批处理脚本进行简单的音视频文件编辑 1.基本介绍 对于每一个从事音视频技术开发的工程师,想必没 ...

  6. 动态符号链接的细节 与 linux程序的加载过程

    转: http://hi.baidu.com/clivestudio/item/4341015363058d3d32e0a952 值得玩味的一篇分析程序链接.装载.动态链接细节的好文档 导读: by ...

  7. kali日常快捷命令(用到就更新)

    什么BASH命令? 在Linux上采用bash作为标准,基本上它描述了对带有".sh"扩展名的vi编辑器等文本的处理并执行. 与编程一样,它有许多函数,如变量,函数和算术处理,所以 ...

  8. 使用mac 终端利用alias设置快捷命令

    在终端中输入快捷命令可以提高工作效率,同时可以少记很多命令 如何做: 首先在~/目录下编辑 .bash_profile这个隐藏文件,如果你想直接双击此文件打开编辑的话请在终端输入 Mac 显示隐藏文件 ...

  9. linux启动后自动登录并运行自定义图形界面程序

    在<Ubuntu CTRL+ALT+F1~F6 进入命令模式后不支持中文显示的解决办法>一文中提到linux启动在以后运行一个独占显示器的图形程序的两种办法. 1.不启动xserver,使 ...

  10. android 获取当前版本号/修改自定义的应用程序的版本号

    1.获取当前版本号 PackageManager pm = getPackageManager(); PackageInfo pi = pm.getPackageInfo(getPackageName ...

随机推荐

  1. 4-11.3 C++中的显式类转换

    目录 static_cast 1.用来改变基本类型:一般是高精度转低精度 2.恢复void* 指针类型 const_cast 用来去除底层const(low-level const) reinterp ...

  2. C# Winform 子窗体提交后更新父窗体datagridview数据(事件和委托)

    首先整理思路 子类调用父类的dgv控件,如果是使用委托和事件的方式,应该在子类定义委托和事件. 见图1 父类将刷新datagridview的方法传入事件中. 见图2 子类再调用此事件.见图3 那么父窗 ...

  3. 接口测试中如何保持session鉴权/会话

    当接口使用token鉴权时,可以直接在响应数据中提取token的值,关联到其他接口使用 如果接口使用的是session鉴权,可以使用session=resquests.Session()方法,创建一个 ...

  4. 2023NOIP A层联测9 T3 天竺葵

    2023NOIP A层联测9 T3 天竺葵 题面及数据范围 Ps:连接为accoderOJ. 看题大概是一个最长上升子序列的带权版本,于是想到 dp. 设 \(dp[i][j]\) 为到第 \(i\) ...

  5. Java反编译器剖析

    本文由 ImportNew - 邬柏 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. Importnew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的Jav ...

  6. MySQL之查询操作

    1)使用in查询, 保持顺序 SELECT * FROM `template_data` where template_id in (7339747298123169843,7339747324194 ...

  7. 根据Xml节点名获取Xpath

    我们经常使用Xpath去获取Xml中某个节点的值,但是有时候我们需要反过来,根据Xml的节点名来获取对应的Xpath. 找了一下,几乎所有的Xml库都没有提供类似的功能,这里我们就简单说一说这玩意咋实 ...

  8. Vue3 组合式API

    1.入口 创建实例时,配置setup方法,然后其内部书写组合式API代码,通过组合式API生产的数据和返回,需要暴漏出去才能给HTML使用 <script> //组合式(解构赋值) con ...

  9. Vue.js 文本行滚动

    1.前言 文本行滚动组件,效果如图 2.封装思路 封装一个组件,接收一个数组,每个数组元素就是一个段文本 组件使用httpVueLoader进行封装加载 使用css位移,配合过渡效果才展示动画 滚动逻 ...

  10. javase学习文档

        javase学习文档(更新) javase 学习文档已更新 查看地址:https://lib.stazxr.cn/codenotes/java/javase/