PowerShell 优化

PowerShell 作为微软发行的下一代终端, 功能非常强大, 然而使用的人却一直不是很多, 前有同门师兄 cmd, 后有 Git bash, Mintty for Cygwin (以及它的升级版 Babun), 特别是 WSL 出现之后, 颇有一种 Mintty for WSL 一统天下之感, 个人认为两个主要原因就是丑和慢.

慢的问题基本无解, 不过个人认为 PowerShell 再慢也比启动 WSL 还是要快上一些, 特别是 WSL 的残废文件系统让我有些难以接受, 至于丑, 本文的一大目的就在于此.

由于很多内容网上都有重复, 因此本文采用简要介绍 + 给出参考链接的方式, 这样的好处在于….emmm…就让我这个懒癌晚期患者再偷一次懒吧…

美化

PowerShell 的丑分两方面, 一方面是默认使用的终端模拟器实在是太不现代了, 另外一方面是其默认使用的字体, 包括主题也令人难以接受 (21世纪10年代末了都, 居然还有人会使用宋体作为默认字体), 因此本文将从这两个方面分别入手, 为提高心情做一些工作.

本文主要参考了这篇文章: 告别 Windows 终端的难看难用,从改造 PowerShell 的外观开始 - 少数派, 此外还有一些参考链接在下文列出.

安装字体

推荐的字体主要是更纱黑体, Microsoft Yahei Mono 应该也行 (但我没有尝试过):

BTW 虽然和本文无关但是还是像推荐一下思源字体, 一组高质量的开源字体:

安装现代终端

此外, 由于 Windows 自带的终端模拟器实在是太丑, 还是使用更加现代一些的终端模拟器来的好一些.

下面的四个都是一些类似的工具, 其中 FluentTerminal 是基于 UWP 的应用, 安装起来麻烦一点, Hyper 和 Terminus 都是基于 Electron 的应用 (没错, 这两个家伙运行速度都挺慢的, 但外观的确比较好看), Cmder 是基于 ComEmu 的应用, 增加了很多功能, 配置也更加方便, 你可以选择任意一个安装, 我反正四个都在用😀

修改 PowerShell Prompt

接下来就是要把 PowerShell 每条命令之前的那段路径给改掉, 这个东西的名字叫提示符, 它的作用主要是告诉用户你现在在哪里, 你是用的哪个用户账户, 但是 PowerShell 默认的展示实在是说不上美观, 因此有人就根据 Oh-My-Zsh 的风格做了一个类似的工具: JanDeDobbeleer/oh-my-posh: A prompt theming engine for Powershell running in ConEmu, 你可以根据链接中的方式进行安装和配置.

如果你对 oh-my-posh 的主题不是很满意, 你可以尝试一下高级配置方法: 妈妈,为什么我的 powershell 和别人不一样?! - 知乎

查看你的成果

接下来就到了完成阶段了! 你可以安装一些工具来获得像本文标题图一样的界面:

最后, 一个美观并现代的 PowerShell 就得到了!

定制

接下来你可以根据你的需求对 PowerShell 进行定制, 通过修改 Profile 来让 PowerShell 每次启动时加载定制指令, 实现初始化环境:

Alias

在 Profile 中添加形如 Set-Alias [-Name] <string> [-Value] <string> [<CommonParameters>] 的语句, Set-Alias 的第一个参数是你要设置的别名, 第二个参数是别名指向的目标, 第三个参数是目标的参数.

值得注意的是, Set-Alias 的第二个参数必须是一个 PowerShell 函数, 而不能直接调用系统 PATH 中的程序, 因此如果你想实现启动 ssh 的别名, 就不能使用 Set-Alias 了, 而是直接创建一个函数:

1
2
3
> function startssh { ssh username@somehost}
> startssh
ssh: Could not resolve hostname somehost: Name or service not known

如果你需要参数, 参考: Powershell 通过函数扩展别名 - PowerShell 中文博客

带有颜色的 ls

PowerShell 默认的 ls 命令是不带有颜色的, 但是网上已经有人开发了带有颜色的 PowerShell 插件, 你可以查看下面的链接来安装这个插件.

joonro/Get-ChildItemColor: Add coloring to the output of Get-ChildItem Cmdlet of PowerShell.

参考配置

最后给出我的 Profile 配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Import-Module posh-git
Import-Module oh-my-posh
Set-Theme Paradox

Import-Module Get-ChildItemColor
Set-Alias l Get-ChildItemColor -option AllScope
Set-Alias ls Get-ChildItemColorFormatWide -option AllScope

function e {explorer $args}

function g {git $args}
function gst {git status}
function ga {git add $args}
function gaa {git add --all}
function gcmsg {git commit -m $args}
function gcam {git commit -a -m $args}
function gid {git init --separate-git-dir=$args}

# "&" 符号的作用是将字符串按 PowerShell 命令执行
function py {&"$($env:HOMEDRIVE)$($env:HOMEPATH)\Anaconda3\python.exe" $args}
function ipy {ipython}
function act {activate $args}
function jl {jupyter lab}