前言

Windows 中的命令提示符 (CMD) 是一个非常常用的工具, 特别是与 Powershell 相比, CMD 更加简单, 对于一些常见的操作来说, 使用 CMD 能够节约不少心智. 但不管怎么说, CMD 比起其它的 Shell 工具来说还是差了不少的, 特别是没有类似于 .bashrc 的初始化方法, 有时候用起来确实比较头疼. 但其实我们可以利用注册表来指定 CMD 的 Autorun 项, 并使用一个 .bat 脚本来执行初始化指令.

原理与实现

其实原理非常简单, Windows 为一部分应用程序提供了 Autorun 的功能, 也就是在执行某个程序之后, 自动执行其它程序, 那么我们只需要让 CMD 启动后自动执行一个初始化 CMD 的程序就可以很容易地实现我们想要的功能了.

在 C 盘根目录下建立一个 initcmd.bat 文件, 记住该文件的路径, 也就是 C:\initcmd.bat. 你可以根据自己的需求调整这个文件所在的位置, 只需要记住对于的文件路径就可以了.

注册表部分

你可以用以下两种方式设置 CMD 的 Autorun 属性, 这两个方法是等价的, 你可以选择任意一个你觉得更好的方法.

手动添加方式

按下 Win + R 组合键, 输入 regedit, 定位到 HKEY_CURRENT_USER\Software\Microsoft\Command Processor, 在右侧新增一个字符串值, 将数值名称命名为 Autorun, 数值数据就是你初始化文件的路径, 也就是 C:\initcmd.bat, 特别地, 这个地方是可以输入环境变量的, 比如如果你把初始化文件放到了你的用户的家目录下, 你就可以使用 %USERPROFILE%\initcmd.bat 这样的名字.

直接导入方式

在任意地方新建一个以 .reg 结尾的文本文件, 编辑它的内容. 添加:

1
2
3
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"AutoRun"="C\\initcmd.bat"

注意: 在指定文件链接的部分需要使用转义字符, 也就是用 \\ 代替 \.

初始化文件部分

接下来就是设置具体的初始化内容了, 这部分你可以使用任何的 CMD 命令, 其中几个非常有用的命令介绍如下:

DOSKEY 命令

其实这个命令和 Linux 里的 alias 有些类似, 它的作用就是给一段命令指定一下别名, 例如你可以使用 DOSKEY ls=dir (Windows 中命令和路径一般不区分大小写, 不过命令大写, 参数小写似乎更好看一些…) 来为 dir 指定一个名为 ls 的别名. 此外, 也支持一些更加复杂的指令:

  • DOSKEY py2=C:\python27\python.exe $*: 给特定版本的 Python 指定别名, 这样就可以方便地指定 Python 解释器了, 不过如果你的环境非常复杂的话, 那我还是建议你使用 Python 的环境管理工具, 例如 conda, Pyenv 之类的. 这里 $* 的作用是不要忽略指令后的参数, 例如当你执行 py2 a.py 时, 如果不添加 $*, 则 CMD 会直接执行 py2 指向的目标 (也就是打开 Python REPL), 而忽略后面的参数 a.py.
  • DOSKEY ws=cd /d D:\workspace: 可以直接用短句切换到常用目录, 节约键盘耐久.
  • DOSKEY jl=jupyter lab: 快速启动应用程序, 这里以 Jupyter Lab 为例.

注意: DOSKEY 如果与逻辑运算符 (例如&&, ||) 同时使用时, DOSKEY 的优先级高于逻辑运算符, 举例来说, DOSKEY test=(echo 123 && echo 456) 的作用是, 将 test 作为 (echo 123 的别名, 然后输出 456).

SET 命令

这个命令就是 Windows 中设置环境变量的命令, 对我来说, 这条命令最主要的作用, 也是我最初想要找到一个 CMD 初始化方式的原因就是我想要在每个命令提示符窗口打开的时候都能自动设置代理, 而设置代理一般来说就是用的 SET 命令. 在初始化文件中添加 SET http_proxy=http://127.0.0.1:1080 来让 CMD 自动初始化 HTTP 代理.

补充说明

由于本文介绍的方法实际上是在 CMD 打开后自动执行 initcmd.bat, 因此你会发现当你打开 CMD 时, 你设置的指令会自动在屏幕上显示, 有的时候这显得不是很美观, 因此我们可以通过在文件开头添加 @echo off 来避免执行时的回显.

以下是我的 initcmd.bat 的例子, 仅供参考:

1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off

doskey ls=dir

doskey ipy=ipython
doskey dl=activate dl
doskey act=activate $*
doskey jl=jupyter lab

doskey ws=cd /d D:\workspace\
doskey blog=cd /d D:\workspace\zhzyx.github.io

set http_proxy=http://127.0.0.1:1080