最近开始做项目布署和发布方面的工作,Dreamforce本着提高工作效率的立场出发,觉得有必要提高一下CMD工作效率。

Window自带的CMD有什么缺点:

1. 没有代码高亮显示,不好看

2. Tab键功能很鸡胁,不能列出当前文件目录,也不能进行命令扩展

3.自动补全功能也不行

最终实现蓝图:

当我在命令行下 输入 ‘maven -’ 按下TAB键,系统会自动提示我Maven相关的参数,这样效率将会是极大的提高,而Dreamforce本人在Google上搜了很久,用了很多关键字,无果。所以下定决心,自己做一个了。

技术剖析:

获取命令行的输入

执行命令并输出结果。

关键字处理及匹配。

 

1.获取命令行的输入

raw_input()与input()

一般来说raw_input()可以获取来自于控制台的任何输入,而input()只能接受Python认为的合法的输入。所以这里我们要果断的选择raw_input()来实现命令输入。

当然Python也有众多的LIB可供选择,对于想了解CMD构造全过程的细节的话,推荐使用Python内建库,因为有些需求它不能满足,而这是这种瓶颈才能够有个中体会。

2.执行命令并输出结果

Python执行命令可以使用os.system(‘cmd’),而且它会自动输出执行结果。但当你试图使用CD命令来改变路径的时候却没有任何改变,这和os.system的函数原理有关。它并不是在同一个Shell下面执行的,而是每次都会新开一个Shell,执行完毕后关闭Shell,返回结果。所以当试图使用CD这种命令时就不会有任何效果,当然subprocess可以将所有Shell执行放在同一个进程但还是不能从根本上解决问题,而这里我给出的解决方案是:

将每一个命令集存为单独一个token ,比如 ‘cd D:\’ 这就应该是两个tokens,然后判断tokens[0] = ‘cd’ 时就执行os.chdir(tokens[1]),相当于将CD命令转义执行。这样就可以保证路径切换正常执行。同理其它的处理方式相当,而将命令保存为TokenList将会有非常多的好处。

3.关键字处理及匹配

上面提到的Tokens,这里就可以很好的进行匹配处理了

这里匹配可以使用正则进行匹配

 

 

matcher = wildcard_to_regex(prefix + '*')
def wildcard_to_regex(pattern):
 """
 Transform a wildcard pattern into a compiled regex object.
 This also handles escaping as needed.
 """
 # Transform pattern into regexp
 translations = [('\\', '\\\\'),
 ('(', '\\('),
 (')', '\\)'),
 ('[', '\\['),
 (']', '\\]'),
 ('.', '\\.'),
 ('+', '\\+'),
 ('^', '\\^'),
 ('$', '\\$'),
 ('?', '(.)'),
 ('*', '(.*)')]
re_pattern = pattern
 for src, dest in translations:
 re_pattern = re_pattern.replace(src, dest)
 re_pattern += '$'
 return re.compile(re_pattern, re.IGNORECASE)
for elem in os.listdir(dir_to_complete)
 if matcher.match(elem)

 

 

 读取配置:

 

def readCrossLineCommands():
    global crossLine_commands
    file_object = open('cross_line_commands.properties')
    try:
       for line in file_object:
          crossLine_commands.append(mytrim(line))
    finally:
          file_object.close( )

 

为防止每次重复读取文件,加一个缓存

 

 
def getCrossLineCommands():
    if(len(crossLine_commands)==0):
        readCrossLineCommands()
    return crossLine_commands

 

 

匹配关键字:

 

  # Add internal commands
        internal_commands =getCustomizationCommands()
        if sys.getwindowsversion()[0] >= 6:
            # Windows 7 or newer
            internal_commands.append('mklink')
        completions_path += [elem for elem in internal_commands
                             if matcher.match(elem)
                             and not elem in completions
                             and not elem in completions_path]

 

自动完成项过滤

 

        completions_path_nice = []
        for i in range(0, len(completions_path_no_ext)):
            similar = [elem for elem in completions_path_no_ext if elem == completions_path_no_ext[i]]
            similar += [elem for elem in completions if strip_extension(elem) == completions_path_no_ext[i]]
            if len(similar) == 1 and has_exec_extension(completions_path[i]) and len(prefix) < len(completions_path[i]) - 3:
                # No similar executables, don't use extension
                completions_path_nice.append(completions_path_no_ext[i])
            else:
                # Similar executables found, keep extension
                completions_path_nice.append(completions_path[i])
        completions += completions_path_nice

 

完成自动匹配

 

    if completions != []:
        # Find the longest common sequence
        common_string = find_common_prefix(prefix, completions)

        if path_to_complete == '':
            completed_file = common_string
        elif path_to_complete == '\\':
            completed_file = '\\' + common_string
        else:
            completed_file = path_to_complete + '\\' + common_string

 

 

主要技术点就在此。提供一个Win7-64位的EXE测试

http://dl.dbank.com/c085pfzdmm

One Reply to “新福利篇:手工打造CMD命令行增强工具(Python2)”

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: