Windows实现用命令行打开应用程序

    当我们用多Linux后,老是想着什么操作都用命令行完成,于是就有了这篇文章。本文提供了一个在Windows系统中使用命令行打开应用程序的方法。

原理

    Windows的终端指令和Linux的类似,一部分是命令行自带的,如 cd ,其他的则是系统环境变量指向的文件夹中的可运行文件,比如你可以在C:\Windows\System32里找到一个名为 shutdown.exe 的可运行文件,它就是你在命令行中输入shutdown后运行的程序。我们想要的相当于是要给终端添加一些命令,添加的命令肯定属于后者。

实现

总结一下我们会做什么:

  1. 找出所有应用程序

  2. 准备好所有我们想添加的命令的可运行文件,给所有这些文件改名成各个我们日后想用命令行打开的应用程序的名字。

  3. 将所有的这些可运行文件加入环境变量

对于第一步,我们可以在开始菜单里找到所有应用程序。而我们知道开始菜单的路径

C:\ProgramData\Microsoft\Windows\Start Menu\Programs
C:\Users\你的用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

前者是所有用户的开始菜单,后者是单个用户的开始菜单。开始菜单中存放了所有应用程序的快捷方式。

对于第二步,命令的可运行文件可以直接用.cmd脚本,这也算可运行文件,并且比起编译出很多exe方便的多。每个.cmd脚本里写的就是打开这个脚本名称对应的应用程序,就可以是:

start "" "D:\Path\to\your\application.exe"

空字符串""用于创建一个空标题栏窗口。如果你还想关闭回显并打开应用程序后命令行后立即切回可用状态的话(就是说,有些应用程序,可能出于debug考虑,在用命令行打开后会持续输出程序的运行状态,你想继续用命令行的话就得打开一个新的终端,要是你Ctrl+C停止的话,应用程序窗口也会关闭),加上两行:

@echo off  
start "" "D:\Path\to\your\application.exe"  
exit

@echo off用于关闭命令回显,exit用于退出脚本。

我们用python脚本来解决这些活

import os
import win32com.client

startMenu = r"C:\ProgramData\Microsoft\Windows\Start Menu\Programs"
# startMenu = r"C:\Users\z1391\AppData\Roaming\Microsoft\Windows\Start Menu\Programs"
gPlusPlus = r"D:\Program Files (x86)\Dev-Cpp\MinGW64\bin\g++"
newDirPath = r"D:\Program Files (x86)\_shellIndex"

def readLnkPath(lnk):
    shell = win32com.client.Dispatch("WScript.Shell")
    shortcut = shell.CreateShortCut(lnk)
    return shortcut.Targetpath


def get_last_part(s,c='.'):
    strr =  s[::-1].split(c)[0]
    strrr = ''
    for i in range(len(strr)):
        strrr += strr[0-(i+1)]
    return strrr

def add_to_path(file :str):
    print("adding "+file)

    with open(newDirPath+'\\'+get_last_part(file,'\\')[:-4]+'.cmd', "w") as cmdFile:
        command = 'start "" "'+file.replace("/",'\\')+'"'
        print("writing ",command)
        cmdFile.write(command)

def main():
    print("start")
    if not os.path.exists(newDirPath):
        os.mkdir(newDirPath)
        print("creating newdir")
    for root, dirs, files in os.walk(startMenu):
        for file in files:
            print(file)
            
            # 简单判断一下文件是否是快捷方式(是否以.lnk结尾)
            if file[-1] == "k":
                eachLnkDir = os.path.join(root, file)
                eachFileDir = readLnkPath(eachLnkDir)

                print(eachFileDir)
                print(eachLnkDir)

                if get_last_part(eachFileDir) == "exe":
                    add_to_path(eachFileDir)


if __name__ ==  "__main__":
    main()

这个脚本会在newDirPath所对应的目录中存放所有创建的用来做命令的可运行文件,可运行文件来源于变量startMenu所对应的开始菜单目录

对于第三步,打开控制面板,搜索“环境变量”,在系统环境变量和用户环境变量(具体看你是否想让这些命令对所有用户生效)中的环境变量path(或Path,或PATH,不分大小写)里加上第二步脚本中newDirPath对应的目录(或者任何你存放了哪些可运行文件的地方)。

收尾工作

你需要进行一些收尾工作

首先,如果环境变量没生效,你可能要重启电脑

其次,开始菜单里的应用程序不一定齐全,也不一定都是你常用的(比如开始菜单里的Windows工具包),你可能要手动添加或删除一些

最后就可以用啦

可以输入application.cmd运行,因为是可执行文件,也可输入application运行,也可名字敲一半再按下tab再执行

你可能感兴趣的:(windows)