powershell 全攻略

我一直以为 powershell 没啥好玩的。。。不过最近了解了一下,比 cmd 强很多,特别是 cmd 没有历史记录这点差评,另外还有包管理器什么的,感觉发现了新世界~

参考文章:

安装包管理器 chocolatey

嘛。。。虽然市面上有两个包管理器,另一个叫做 scoop 理论上更合适程序员使用,但是 chocolatey 更合适懒人使用。。。于是我选择后者。

安装方法,一行流:

1
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

几个常用的命令:

  1. 查找

    1
    clist xxx

    几乎所有开源常用的软件和大多数免费的非商业都有。

  2. 找到了以后安装

    1
    choco install xxx
  3. 查看目前系统中 chocolate 安装的所有应用

    1
    clist -l
  4. 套代理(永久)

    1
    choco config set proxy http://127.0.0.1:3081

    取消代理

    1
    choco config unset proxy

    临时代理(以安装为例)

    1
    choco install --proxy=127.0.0.1:3081 xxx
  5. 卸载

    1
    cuninstall xxx

另外,因为国内网络因素和程序设计影响,chocolatey 不可避免的会遇到下载失败的问题,一般从几个方面去解决:

  1. 使用--pre参数
  2. 下载前一个或后一个版本
  3. 使用--checksum64+正确的md5或者是--ignore-checksums参数

另外,提一下,还有另一个比较热门的包管理器叫 scoop,我不打算写使用方法了,可以参考下面三篇文章:

和 chocolatey 相比,有几个优点

  1. 支持 aria2c 进行多线程下载
  2. 可以添加个人仓库,github 里面有几个热门仓库,你甚至可以考虑自己做一个

但缺点也很多

  1. 速度仍然堪忧,仍然有可能遭遇哈希值错误
  2. 加仓库前还要先装 git
  3. 不加仓库的话原有的软件包根本不够用,太少了
  4. 就算是加了仓库也不够。。。github 上热门的就前几个仓库,加了仍然找不到小狼毫,而且加仓库的操作不能说不繁琐,仓库软件分布的很分散,甚至连 java 环境都有一个专门的仓库管理,想用还要加那个仓库
  5. search 本来就慢,加仓库更慢

中间这两个生态问题,相当致命,除非是有精力自己建仓库,否则不推荐使用。

微软默认 powershell 美化

默认的 powershell 界面从颜色和字体上看都比较丑。。。有两个方案,一个是美化这个预装版,还有一个是装一个第三方,预装版的优点是加载快,所以先说怎么美化这个预装版。

界面颜色美化

利用 colortool 这个工具

1
choco install -y colortool

查看有多少种颜色方案

1
colortool -s

然后预览一下

1
colortool xxx.itermcolors

发现问题了,这颜色咋那么奇怪呢?

原来是 colortool 默认是按 powershell 背景为全黑的时候设计的,当然因为 powershell 现阶段默认背景早已经是蓝色了,所以作者已经把这点当做 bug 在处理了。Bug Report: ColorTool and changing colours causes strange behaviour since Windows 10 1903 #1150

至于临时的解决方案,就是右击窗口,将颜色和默认值都调到第一个颜色上,再用 colortool 命令设置颜色。

而如果要永久设置主题的话,加上 -b 参数,再右键窗口进入默认值和属性中各点一次确定生效。

1
colortool -b OneHalfDark.itermcolors

修改字体

修改字体就麻烦一些。为什么 Windows 下 cmd 和 PowerShell 不能方便地自定义字体?因为 powershell 要求字体需要满足微软规范(否则 powershell 默认值里面根本看不到)和编码代码页语言编码要求(否则等宽字体只能在默认值中看到,属性里面看不到),最好支持 powerline(待会有用),所以一共有三种方法可供使用。

  • 安装符合微软规范的等宽字体(符合规范的等宽字体能够在注册表相应项中找到),修改注册表,打上 powerline 补丁
  • 安装符合微软规范的字体,给所有字体打上 powerline 补丁(和当年通过工具撤销系统字体的 graph 优化然后替换是如出一辙的方法)
  • 安装符合微软规范且支持 powerline 的字体

打 powerline 补丁的方法都很麻烦。。而且如果你安装的字体比较多的话,有些字体没有必要打上补丁的也打上了(打补丁不止会打符合规范的字体而是所有补丁都打),就会浪费时间和空间。

而符合微软中文编码规范的字体,找来找去就两种,知乎 belleve 大佬的更纱黑体(Inziu Iosevka)和 Microsoft YaHei Mono,后者同样要打上 powerline 补丁。全部支持的就只有更纱黑体,在 powershell 中兼容性相当不错。但是。。。我觉得字形不太好看了,非常扁。(也可能是微软的规范下只能做出这样的字形?)

当然还有传说中的支持 powerline 却不符合微软规范的字体。。。在这里不适用,看下面。

补充:关于第一个,各种教程都写得很不详细。。。我决定补一下。

参考文章:

  1. 安装等宽字体。安装时记住名字(字体管理器里面会有写)。然后去注册表里面确认一下名字(注意!只是确认有没有安装,第二步里面的字体名字以字体管理器的为准,不要用下面注册表的!),如果是为自己安装的字体名称在HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Fonts,为系统安装或者默认就有的字体在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts,有种方法是在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont以名称加 0 的方法添加各新编码字体,但我试了试,根本没用。

  2. 记好名字以后,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink配置中文 fallback。具体来说,新建一个多行字符串值,名称为你选的等宽字体,填入的参数为检测到中文时回退到的字体。比如你决定用Cascadia Code做 powershell 的字体,中文回退到微软雅黑,那么新建一个名字为Cascadia Code的多行字符串值,值为

    1
    2
    MSYH.TTC,Microsoft YaHei UI,154,115
    MSYH.TTC,Microsoft YaHei UI

    这个大小大概按照英文字体比例来写。英文字体基本上是 128\96,而大部分英文字体对雅黑的比例都是 1.6,所以填上面这两个数字。如果你感觉宽了或者窄了,稍微改改也可以。最后让默认值和属性都指向你想用的这个字体,改完以后重启电脑。

  3. 进入 powershell,更改编码,默认中文编码为 GBK,改成 GB2312 就能更改为默认字体且正确的显示中文了。

    1
    chcp 54936

    然后去属性里面改成你刚刚改的字体再重启就 ok 了。

    当然,每次启动前都要打这一串才能转到 gb2312,如果要启动时自动设定的话,需要动一点手脚。(1909 前的系统不需要动手脚,每次启动默认出来的就是进入 gb2312 模式后设置的字体,不过属性面板里面还写着点阵字体而已,如果还要修改需要回到 gb2313 去,写入配置文件中反而会导致中文字体挤在一起)。新建 powershell 的配置文件。

    1
    2
    if (!(Test-Path -Path $PROFILE )) { New-Item -Type File -Path $PROFILE -Force }
    notepad $PROFILE

    然后在弹出的 notepad 里面输入:

    1
    [System.Console]::OutputEncoding=[System.Text.Encoding]::GetEncoding(54936)

    就 ok 了。

    另外,上面的文章 1 里面给了一个文件,是 monako 字体加一个注册表文件,使用完那个注册表文件以后甚至不用该编码。。。原来的 gbk 下的点阵字体直接就变成 monako 了,原因未知。(其实就是进去以后改成了 monako 字体,那个注册表文件只是修改了 monako 的 fontlink)

  4. (21.1.9 更新) 实验过,改成 utf-8(65001)也没出什么岔子。而且我的系统经过一番操作,没加啥代码,他自动帮我换成 utf-8 了。。。另外,参考正确解决 VS Code / GCC / Clang 编译时中文乱码问题 - 简书,这里有另一个指令,能修改编码为 utf-8,同样是写在 notepad $PROFILE 中:

    1
    $OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding

    和上面那个指令不同的是,这个指令对 chcp 同样有效(即只输入 chcp 会显示你当前窗口的编码,但实际上 powershell 真正的编码在属性->选项->当前编码页中。4 的命令只会修改属性里面的,而这个指令同时修改属性和 chcp 的)。不过从实际效果来看,无论是用那个指令,修改成 gb2312 还是 utf-8,暂时没发现区别。

安装 oh-my-posh 和一些其他的东西

其实就是 oh-my-zsh 的 windows 版。。。

参考文章:

先给出一些 powershell 上一些常用的操作

  1. 安装模块

    1
    Install-Module xxx
  2. 查看当前模块版本

    1
    Get-Module xxx
  3. 寻找可用模块

    1
    Find-Module -Name xxx -AllVersions
  4. 卸载模块

    1
    remove-module posh-git

主要安装步骤

  1. 开启策略(注意,如果你的个人文档在 d 盘,系统在 c,重装系统后其实不用再走下面的步骤了,但是要走这一步;如果之前安装了 chocolatey,这一步也不用做了)

    1
    2
    3
    Set-ExecutionPolicy Bypass
    #Set-ExecutionPolicy Unrestricted
    #使用该策略可能会导致管理员模式下不可安装模块,需要进入普通用户模式安装

    (可选)安装模块时候经常遇到提示「不受信任的储存库」,可以按 A 或 Y 跳过,也可以直接关闭检测:

    1
    Set-PSRepository -Name PSGallery -InstallationPolicy Trusted
  2. 安装依赖模块 posh-git 和 psreadline

    1
    2
    Install-Module posh-git -Scope CurrentUser
    Install-Module -Name PSReadLine -Scope CurrentUser -Force -SkipPublisherCheck
  3. 安装模块 oh-my-posh

    1
    Install-Module oh-my-posh -Scope CurrentUser
  4. 然后按美化 powershell 修改字体里面的第三部新建配置文件(如果建了就不用了),填入

    1
    2
    3
    Import-Module posh-git
    Import-Module oh-my-posh
    Set-Theme Paradox

重启 powershell 生效。

补充注意

  1. 安装的 posh-git 和 psreadline 都安装的是非最新版,如果要安装最新测试版可以考虑把这两个原版卸掉,然后更新 powershellget(自带的 powershell get 好像无法识别测试版的安装参数),并重启。

    1
    2
    3
    remove-module posh-git
    remove-module psreadline
    Install-Module -Name PowerShellGet -Force

    然后安装最新测试版(版本号可以去 powershell 官网要)

    1
    2
    Install-Module -Name PSReadLine -RequiredVersion 2.1.0-beta2 -AllowPrerelease
    Install-Module -Name posh-git -RequiredVersion 1.0.0-beta4 -AllowPrerelease

    (20.8.10 更新) 可以尝试直接强制更新,而不是卸载。关闭所有 powershell 窗口,在 cmd 下运行。

    1
    2
    powershell -noprofile -command "Install-Module PSReadLine -Force -SkipPublisherCheck -AllowPrerelease"
    powershell -noprofile -command "Install-Module posh-git -Force -SkipPublisherCheck -AllowPrerelease"
  2. 自动补全有另一种形式,就是显示出所有候选项的形式,可以通过

    1
    Set-PSReadLineKeyHandler -Key Tab -Function Complete

    来打开。当然这是暂时的打开,永久打开添加到 $profile 里就行了。

  3. 然而就算如此,教程里面展现的什么都没调整就能享受到的带方向键的自动补全。。。实在是搞不出来

    如果要使用方向键式自动补全,修改 2 的语句为

    1
    Set-PSReadLineKeyHandler -Key Tab -Function MenuComplete
  4. 智能提示。需更新到 2.1.0-beta1 后版本。参考:Fish-like autocompletion

    1
    2
    set-psreadlineoption -predictionsource history
    get-psreadlineoption | % predictionsource
  5. 其他有用的功能。比如上下翻选时根据当前已输入的内容进行筛查而不是安装当前历史记录。可参照配置文件 SamplePSReadLineProfile.ps1。需要将其所有内容放到 profile.ps1 的最前端。

  6. 如果遭遇 Install-Module : A parameter cannot be found that matches parameter name AllowPrerelease.,先更新 PowerShellGet。参考:Install-Module : A parameter cannot be found that matches parameter name AllowPrerelease.

    1
    Install-Module -Name PowerShellGet -Force

powerline 补丁

oh-my-posh 装好后,使用主题会发现各种乱码,因为主题是靠各种 powerline 字体实现的。

在修改字体那里说过,要么上支持 powerline 的字体要么给字体打补丁。

打补丁的工具叫做 nerd-fonts,需要在 linux 环境下才能使用。当然,系统比较新的话,可以考虑用 wsl ubuntu。下文就是用这玩意进行补丁的。

参考文章:

  1. 安装依赖

    1
    2
    3
    4
    5
    6
    sudo apt-get install software-properties-common
    sudo add-apt-repository ppa:fontforge/fontforge
    sudo apt-get update
    sudo apt-get install fontforge
    sudo apt install python-pip
    sudo pip install configparser
  2. 通过 git 或者下载源码的方式,主要是将项目目录下的 src 文件夹和 font-patcher 脚本下载到本地

  3. 通过explorer.exe .命令,将第二部的文件以及字体全部拖到执行文件夹中。

  4. 打补丁

    1
    fontforge -script font-patcher Cascadia.ttf -c

    打好补丁的字体会存在执行文件夹中,安装就是了。安装后可能还需要返回修改字体那部对字体的汉字 fallback 进行设置(另外打完补丁的字体名字会发生改变)

已知问题关于每行「〉」符号乱码的解决方法

在 powershell 中,尽管字体打完了补丁,但还是有一个符号会显示为方框,就是每行开头的「〉」符号。而且使用更纱黑体,换用其他终端都没问题。已向作者提出 issue:The symbol ‘〉’ can not display in powershell

提问半小时,解决五分钟。。。还是自己解决的,不过还有些小疑点,看看有没有人回我 issue~

简而言之,那个方框符号其实和我猜的差不多,不在 powerline 里面(因为我提问前搜索了一下 powershell 相关的 issue,也有个问题作者回了「你乱码的符号其实不是 powerline 符号」,但和我提问的符号不一样,所以我就开 issue 了」)

那问题出在哪呢?另外两个 terminal 都没问题哦?突然想起,在 terminus 里面看中文和 powershell 里面我配置过 fallback 的中文字形明显不太一样,而且就算我没配过 fallback,terminus 那边的字形也还属于「能看」级别的。

那我大概知道问题在哪了

  1. 那个符号应该是靠 fallback 到正确字体显示出来的
  2. 国外用的是英文 windows 操作系统,和中文操作系统的 fallback 回退可能不太一样,它们回退到了能够正确显示那个符号的字体,而我们大概率是回退到了垃圾宋体

那问题就很好解决了,从参考文章第二篇我们可以看到作者这么处理了方框文字:

在其中新建多字符串值,名称为:Sarasa Term SC,内容为:

1
2
3
4
5
6
7
8
9
10
MICROSS.TTF,Microsoft Sans Serif,108,122
MICROSS.TTF,Microsoft Sans Serif
MINGLIU.TTC,PMingLiU
MSMINCHO.TTC,MS PMincho
BATANG.TTC,Batang
MSYH.TTC,Microsoft YaHei UI
MSJH.TTC,Microsoft JhengHei UI
YUGOTHM.TTC,Yu Gothic UI
MALGUN.TTF,Malgun Gothic
SEGUISYM.TTF,Segoe UI Symbol

这段内容是复制的宋体SimSun的,如果你愿意的话,可以用同样的方法把 Sarasa 系列的都注册一下,如果像我这么懒的话,只修改这一个,然后重启计算机也是可以了。修改之后的效果是这样的:

当然我们知道,现在最新的 sarasa(更纱黑体)已经解决这个问题了。而是否需要复制这么多的 fallback 呢。。。我尝试了一下,只需要最后一行好像就行了。当然我也不确定这样做后面会有什么新问题,这就是为什么那边的 issue 我想继续开着的原因。

其他黑科技

以下内容设置完后记得关键指令保存到配置文件里面去~

1
notepad $PROFILE

彩色标记文件

使用 pscolor 模块。

1
2
3
Install-Module PSColor
#关键指令
Import-Module PSColor

显示全部历史记录

参考文章:Set-Alias

默认的history指令只能显示当前窗口的历史记录。如果要显示全部的历史记录,需要输入命令:

1
cat (Get-PSReadlineOption).HistorySavePath

但这命令太长又不好记,所以用alias简化。

1
2
3
#下面两个都是关键指令
function his {cat (Get-PSReadlineOption).HistorySavePath}
set-alias -name allhistory -value his

往后用 hisallhistory就能看到所有的历史记录了。不过有一个 bug 我暂时不知道怎么处理,历史记录中若是有中文,会显示为乱码(但乱的很整洁,起码字符数没变。。。影响不算太大)。

启动时显示机器信息

可能会拖慢启动速度,慎用。

screenfetch

1
Install-Module -Name windows-screenfetch

使用

1
2
#关键指令
screenfetch

启动。

winfetch

磁盘信息显示没有上面这个全(只会显示系统盘),快一些,但咱不用 scoop,所以安装略微麻烦。有两种安装方法:

  1. 直接通过命令安装

    1
    Install-Script -Name winfetch

    安装出来的是 v1.0 版本,界面和最新版有些差距

  2. 通过 github 获取

    根据作者写的 wiki:Basic Usage,先需要去自己的 github 中添加一个公钥,并将对应的私钥放在自己 git 目录下的 .ssh 文件夹中,最后通过 ssh -vT git@github.com 命令处理后才能运行 wiki 中的第一条命令拷贝库。

    1
    git clone git@github.com:lptstr/winfetch.git winfetch

    不过最后验证出来是大费周章。。。直接 git 源库就好了

    1
    git clone https://github.com/lptstr/winfetch.git
  3. 然后处理一下,最新版本是 v1.2.0 来着(可选,否则安装的是最新分支的测试版,如果要做第五步的自定义的话这步是必须的,测试版报错,不过经过测试,正式版也可能报错。。。)

    1
    2
    cd winfetch
    git reset --hard v1.2.0

    拷贝到 windows powershell script 默认目录下,windows 应该会自动帮你添加到系统路径里面,大概是 C:\Program Files\WindowsPowerShell\Scripts,如果拷进去发现不能运行的话,说明没帮你添加,需要自行添加。

  4. 最后运行

    1
    2
    #关键指令
    winfetch

  5. 自定义 winfetch 显示内容

    参考文章:Configuration

    下载配置文件

    1
    winfetch -genconf

    如果报错下载不下来,可以自己创建

    1
    notepad C:\Users\[用户名]\.config/winfetch/config.ps1

    内容大概是

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # ===== WINFETCH CONFIGURATION =====

    # Remove the '#' from any of the lines in
    # this file to **enable** their output.

    @(
    'None'
    'Show_Title'
    'Show_Dashes'
    'Show_OS'
    'Show_Computer'
    'Show_Uptime'
    'Show_CPU'
    'Show_GPU'
    'Show_Memory'
    'Show_Pkgs'
    # 'Show_Terminal'
    # 'Show_Disk'
    # 'Show_Pwsh'
    ) -join ','

    将不需要显示的注释掉就好了,默认情况下注释掉了下面三个(如果不创建这个文件的话,其实是全部显示的)。

proxychains powershell 版(20.6.26 更新)

linux 那边(19.11.12)的 proxychains4 在 powershell 这边也有相应的版本,就叫 proxychains。

在这里下载:shunf4/proxychains-windows

解压后将其中的 exe 和 dll 全部转移到一个好找的文件夹里面,比如 D:\proxychains

然后将该文件夹添加到系统变量 PATH 中。

再把其中的 proxychains.conf 解压到 %USERPROFILE%\.proxychains\ 里面,修改最后一行(其实这行默认适配 ss,如果用的是 ss 默认配置就别改了),改为

1
socks5 [ip] [端口]

然后添加 alias 简化

1
2
#关键指令
set-alias -name fan -value proxychains_win32_x64

测试(注意用的是命令是 curl.exe 而不是 curl,原因见这里:powershell中调用 curl 的正确方法

1
fan curl.exe cip.cc 

curl 中文问题(不完美解决)(20.6.26 更新)

首先

相信上一步运行时,之前没通过 chcp 54936 改编码(其实改了也乱码,要改成 chcp 65001 才有用)的诸位发现问题了。

curl 出来的都是乱码。

除了修改编码,还有一种方法能够解决。但必须进入 cmd,在 powershell 下除非临时改编码否则暂时无解。

参考文章:CURL 中文乱码解决方法

进入 LibIconv for Windows 下载 Complete package, except sources,安装。

增加系统变量(以默认的安装位置来说)

1
C:\Program Files (x86)\GnuWin32\bin

进入 cmd,然后运行

1
2
cmd
proxychains_win32_x64 curl cip.cc| iconv -f utf-8 -t gbk