SANSUI的博客

系统外观
© Sansui 2026
All rights reserved
Sansui的博客
人活着就是为了卡卡西

Windows 命令行相关配置

2023年11月29日
阅读评论

更新于 2026-01-18


常用 shell

一直以来 windows 的命令行方案都很多,个人感觉都有不太好用的点,怎么配置也是仁者见仁智者见智的一个事情。先总结一下常用shell 方案

  • powershell 官方shell,各种工具库支持最全,缺点自带的命令太长,以至于完全没有日常使用的想法。
  • msys2 windows 上的类 unix 环境,基于现代 Cygwin (POSIX兼容层) 和 MinGW-w64(工具包)。确实像 unix,一般命令可以无缝迁移。缺点是兼容性,需要手动配置很多东西,比如是否继承 windows 环境变量,不继承的话不想维护两份环境,继承了又容易冲突。
  • git bash msys2 阉割版,无包管理,多了 git。
  • wsl 完全的 Linux 子系统,但太占内存。

方案选择

我需求

  • 常用命令必须是类 unix 命令
  • 冷启动快较
  • 有包管理器,各类命令行工具配置友好且兼容性不错。
  • 不要太占内存

结果发现这是四圈相交,没有任何一个常用方案能满足以上要求。

最后,我决定用 powershell。除了第一条外都满足。后面两条属于难以解决的硬伤,而第一条可以编写脚本,将常用的命令模拟。

两年后我觉得这个决定无比正确。因为这两个系统底层是完全不同的,系统管理的软件也完全不同。只是模拟一下日常使用的命令的话,自己写的几个足够无痛迁移的了。当然,语法上比如换行、管道之流,会差得非常多,但是在日常使用中倒也不会日常写脚本。

如果具体到需要使用某个应用(比如 node),还是应该用给 windows 编译的版本,而且这个工具一定是在 windows 的环境变量里,不要像 unix 的习惯那样放在终端的配置文件里。

msys2 不太实用的原因也在于此,在 msys2 里面配置的工具集难以准确筛选出需要暴露到系统中的部分。有的时候你可能只是想用一下 g++ 。最后发现模拟半天,不如用 rust(不是)

powershell 配置流程

包含工具包、终端美化。

  1. Install the latest Powershell Core
  2. Install git-bash for basic bash and git tools
  3. Install Windows Terminal and open Powershell
  4. Install PSReadLine
  5. Install starship with scoop. (or oh-my-posh with winget)
  6. Install gsudo for softlink
  7. Install eza for listing
  8. open $PROFILE in powershell, append the contents of Microsoft.PowerShell_profile.ps1

大致介绍一下用途。

  • git-bash,一系列类 unix 工具,git 一类的
  • Windows Terminal,微软的终端。我拒绝终端用 electron 去套的……
  • PSReadLine,改变一系列 powershell 的行为。比如复制粘贴的快捷键。可惜在 vscode 里会没用,只能右键粘贴。
  • starship,美化。如果用 oh-my-posh,需要用 Winget 或者自己 Setup 安装,不要让 Scoop 装,找环境变量这一步能把启动速度拖慢1s。
  • gsudo,提权,类似 unix 的 sudo。可能运行时会被杀软报毒,需要加入信任区。
  • eza,2024年了,终于有了一个像样的 ls 替代……

powershell 的用户配置文件输入 $PROFILE 就能找到。

我的配置文件上传到了 Microsoft.PowerShell_profile.ps1。需要挂代理打开。配置文件包含 ls ln open grep which 等命令模拟。powershell 的缩写默认支持了 mv cat rm 等命令,配合起来日常基本够用。

终端代理

我在配置文件中设置了proxyunproxy函数,以快速设置与取消终端的代理连接。自己改下端口就能用。因为我自己习惯上不开系统代理,都是软件内的 http 连接。

powershell
# Proxy Togglers
function proxy {
	$portInUse = netstat -ano | findstr "LISTENING" | findstr "7890"
	$portInUse2 = netstat -ano | findstr "LISTENING" | findstr "10808"
	if ($portInUse -ne $null) {
		$env:HTTP_PROXY = "socks5://127.0.0.1:7890"
		$env:HTTPS_PROXY = "socks5://127.0.0.1:7890"
		Write-Host "Proxy set to socks port 7890"
	} elseif ($portInUse2 -ne $null) {
		$env:HTTP_PROXY = "socks5://127.0.0.1:10808"
		$env:HTTPS_PROXY = "socks5://127.0.0.1:10808"
		Write-Host "Proxy set to socks port 10808"
	} else {
		$env:HTTP_PROXY = "socks5://127.0.0.1:1080"
		$env:HTTPS_PROXY = "socks5://127.0.0.1:1080"
		Write-Host "Proxy set to socks port "
	}
}
function unproxy {
	$env:HTTP_PROXY = ""
	$env:HTTPS_PROXY = ""
}

其他常用工具

  • winget:自带的包管理器,命令行工具都是这个装的。部分用的 scoop,非常少。还有的直接用的官网 setup。
  • nvim:命令行编辑器,vim 的替代品。自己还是配了一个无 LSP 版本的 nvim的。感想是 windows 真难。nvim 就是属于只有自己配过才能符合需要且记得住那么多的快捷键,因为都是自己常用的。
  • nodejs:JS 环境,nvim 的插件要用,开发也要用。用 nvm 管理的,感想是不要随便 update 自己。
  • zoxide:快速跳转目录。最有用的功能没有之一。类似于 Linux 上的 autojump
  • ripgrep:类似 grep 的用法。我在模拟 grep 命令时只是单纯替换成了 findstr,真的 grep 建议用 ripgrep (rg) 替代。nvim 的 telescope 一些插件也会用到。

安装脚本汇总:

powershell
winget install neovim
git clone --depth=1 https://github.com/sansui233/my-nvim ~\AppData\Local\nvim

winget install gerardog.gsudo
# z-jump
winget install zoxide # z-jump, see https://github.com/ajeetdsouza/zoxide
winget install BurntSushi.ripgrep.MSVC # grep 的完全替代品

ZSH

有关 zsh 相关的配置,我放在了 Windows 命令行相关配置之 msys2+zsh+zi 。现在完全不用 zsh主要是启动慢解决不了。bash 还偶尔用一下。从速度上说,我体感是

  • bash 0 配置 = powershell 配置完
  • zsh 0 配置 = bash 加上 oh-my-bash

一旦体验过 600ms 内的冷启动速度,就再也回不去了…… windows 关窗口等于关进程,我已经不知道多少次误关过邮件服务了,这使得 windows 冷启动的场景比 mac 多很多,所以冷启动速度还挺关键的。

另外就是两种风格的路径不通用实在有点麻烦,pwd 还需要专门转 cygwin 转一下。每次用 which 还得 cygpath.exe -w $(which bash) 。后面才觉得路径不通过这个点算是比较致命的……以及环境隔离的话,又很难同步 ssh 配置……

速度优化

上述包都是我优化很久之后的结果,实际上安装第三方的工具时,会有各种东西注入来拖慢启动速度。

1. Conda

conda 初始化后,启动脚本会放到 User 级别的 profile.ps1 里,能拖慢3秒启动……

解决方法:不要用 conda,用 uv。或者写成一个启动函数

powershell
function Conda-Activate {  
#region conda initialize  
# !! Contents within this block are managed by 'conda init' !!  
If (Test-Path "C:\Users\lingn\scoop\apps\miniconda3\current\Scripts\conda.exe") {  
    (& "C:\Users\lingn\scoop\apps\miniconda3\current\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | ?{$_} | Invoke-Expression  
}  
#endregion  
}

2. 美化的选择

我发现 starship 比 oh-my-posh 慢了 200ms……这也是我还是在用 oh-my-posh 的原因。大概是因为 starship 开箱即用很全面。

3. posh-git

git 补全也是很爽,但是能启动拖慢 700ms……所以注释掉了。真的遇到不会用的命令与其看 command line 不如问 AI 快。

更新于 2023-11-28
Waline