本文讨论地址 https://bbs.blog.vvzero.com/d/9-dis-windows-powershell-user-alias

直接看步骤的话,在最下方。

背景

Windows Terminal 虽然还处于预览阶段,但是也出来很长一段时间了。它的历史使命,也许就是让原生 Windows 也能有一个像样的命令行环境。以前我一直在用 Cmder,但是 Cmder 的启动速度确实不敢恭维,而 Windows Terminal 启动确实很快。相比 Cmder, Windows Terminal 还缺少很多功能,不过以后应该很快也会补上。

我想尝试使用 Windows Termimal 进行开发。Windows Terminal 默认可以使用 PowerShellcmdwsl bash作为脚本工具。既然是在 Windows 环境下嘛,还是得尊敬一下 Windows PoweShell 的。初次使用,我觉得 PowerShell 跟 Cmder 用起来,最不方便的一点就是,我在 Cmder 里面设了很多的 Alias,也就是通过修改 config/user_aliases.cmd 写一串 <alia>=<xxx> <xxx> 来实现的。

但是,PowerShell 如何实现命令的别名设置呢?

探索过程及原理概述

如果搜索关键词 windows powershell set user alias,通常谷歌会给出微软官方文档,但是这个文档只是告诉我们如何在脚本里面设置临时的别名,如果要设置永久别名,该怎么办?实际上,“别名”这种东西,也就是 alias,几乎所有的脚本语言,都没有所谓的“永久别名”(Permanent alias),我们使用 Linux bash 、Cmder 之类的脚本工具,打开终端时,系统会默认执行一个脚本文件( bash 是用户目录下的 .bashrc,Cmder 是 config/user_aliases.cmd ),而这样的脚本文件里,就包含了别名的定义。这也是为什么,我们在 Linux 类系统中,修改 .bashrc 后,必须要重新登出登录、或者 source .bashrc 的原因了。

所以,我们只要修改 Windows Powershell 启动时执行的文件就行了。很多论坛里面说,默认执行的脚本是 $Home\Documents\profile.ps1 ,也就是 C:\Users\你的用户名\Documents\profile.ps1 ,但是这并不正确,最好的方式是,先启动 PowerShell ,再执行 echo $profile,这样得到的文件路径,才是 PowerShell 的默认执行文件路径。

然后,创建这个文件就好啦。

在文件里面,写上别名设置的语句。再一次注意,假如你的别名指代的命令含有空格,就不可以使用 New-Alias 命令,因为它不能带空格,即使你把指代的命令用引号括起来也没用。那怎么办呢?继续谷歌,原来,正确姿势是用 function ,也就是,我们把自己要定义的指令,定义为一个函数,就行啦。

保存文件,重新启动 PowerShell 以后,不出意外,应该会报一个 File xxxxxxx\Microsoft.PowerShell_profile.ps1 cannot be loaded because running scripts is disabled on this system. 根据此链接,出现这种情况,是因为 Windows 系统为了防止恶意脚本自动执行,故默认不允许自动运行脚本。所以,在确定自己有能力把控的情况下,__以管理员身份__,在 PowerShell 中执行 Set-ExecutionPolicy RemoteSigned ,即可。

再次重启 PowerShell,应该可以发现,自定义别名已经生效了。

步骤整理

如果你想为自己的 Windows PowerShell 设置永久的命令别名 (Alias),可以遵循以下步骤:

  1. 打开 PowerShell ,运行 echo $profile,会输出一个文件路径。创建这个文件。

  2. 打开刚创建的文件,按以下格式设置多条别名:

    1
    function 别名 { 需要替代的命令,可以包含空格 }
  3. 以管理员身份打开 PowerShell,执行 Set-ExecutionPolicy RemoteSigned

  4. 重新启动 PowerShell ,应该已经完成了。