1+1=10

记记笔记,放松一下...

Windows下CMD、Powershell、pwsh与Terminal小记

terminal

从传统的 cmd.exeWindows Powershell,再到跨平台的 PowerShell Core,随着 Windows 系统的不断发展,命令行工具上的选择也越来越多(乱),稍作记录

Windows 下的黑色窗口到底叫什么?

  • “控制台”??那个黑色的文字交互窗口本身
  • “命令提示符”??运行在控制台中的 CMD.exe 程序
  • “终端”??现代化的工具(如 Windows Terminal),支持运行多个命令行解释器
  • “Shell”??负责解析命令的实际程序。
  • ...

列个表

工具 类型 平台支持 特点和用途 适用场景
pwsh.exe Shell+脚本语言 跨平台 跨平台支持,持续更新,现代化功能丰富 跨平台脚本开发、云计算管理
powershell.exe Shell+脚本语言 Windows 深度集成 Windows,成熟稳定,但已停止更新 Windows 系统管理、企业环境
cmd.exe Shell Windows 基础命令行工具,支持旧版批处理脚本 简单任务、运行旧版脚本
command.com Shell DOS/早期 Windows 16 位环境,仅用于兼容性目的 运行旧版 DOS 程序
Windows Terminal 终端模拟器 Windows 多标签、多主题,支持丰富的命令行工具 多工具整合、开发者日常任务

pwsh.exe(Powershell Core,Powershell)

  • 首个预览版发布于2016年,正式版PowerShell Core6.0发布于2018年,2020年更名为PowerShell7(注意它和Windows Powershell的关系)
  • pwsh.exePowerShell Core/PowerShell 的可执行程序。
  • 它是 PowerShell 的现代化版本,由 Microsoft 基于 .NET Core 开发,支持 Windows、Linux、macOS
  • 相较于 Windows PowerShell,它更轻量、更快,并且提供了跨平台兼容性。

对powershell的评价挺两极分化的,它的问题包括:

  • 学习曲线较陡,对新手不友好
  • 对 Unix/Linux 用户来说不够直观
  • 对 Windows 用户的传统习惯冲击大
  • ...

面向对象

PowerShell(pwsh) 和 CMD 的核心区别之一是 PowerShell 是面向对象的,而 CMD 是基于文本的。理解这一点的关键在于它们处理数据的方式:CMD 将命令输出作为纯文本,而 PowerShell 将命令输出作为对象。

Cmdlet 是 PowerShell 的核心命令,是一种小型、轻量级的命令行工具

  • 所有 Cmdlet 都采用统一的命名规范,格式为 Verb-Noun(如 Get-Process、Set-Location)。
  • 动词表示操作(如 Get、Set、Remove 等),名词表示目标对象(如 Process、Location 等)。

找个例子看看:

1
Get-ChildItem
  • 输出是一个对象列表,每个文件或文件夹是一个 System.IO.FileInfo 或 System.IO.DirectoryInfo 对象。
  • 这些对象包含丰富的元数据,例如文件名称、大小、创建时间等。
1
2
3
4
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----        2025-01-01  10:00 AM                Documents
-a----        2025-01-01  10:00 AM         12345 example.txt

可以直接访问这些对象的属性,例如文件名和大小

1
Get-ChildItem | Select-Object Name, Length

可能这样更直观

1
2
$files = Get-ChildItem
$files[0].Name  # 获取第一个文件/文件夹的名称

别名

别名是一种对完整命令(Cmdlet)的简化表示。常见的别名

别名 对应命令 说明 来源 类似于
ls Get-ChildItem 列出文件和目录 模拟 Linux 下的 ls 命令 Linux 的 ls
pwd Get-Location 显示当前目录 模拟 Linux 下的 pwd 命令 Linux 的 pwd
rm Remove-Item 删除文件或目录 模拟 Linux 下的 rm 命令 Linux 的 rm
mv Move-Item 移动或重命名文件/目录 模拟 Linux 下的 mv 命令 Linux 的 mv
cp Copy-Item 复制文件或目录 模拟 Linux 下的 cp 命令 Linux 的 cp
cat Get-Content 显示文件内容 模拟 Linux 下的 cat 命令 Linux 的 cat
man help 获取命令帮助信息 模拟 Linux 下的 man 命令 Linux 的 man
sleep Start-Sleep 等待指定秒数 模拟 Linux 下的 sleep 命令 Linux 的 sleep
grep Select-String 查找文本内容 模拟 Linux 下的 grep 命令 Linux 的 grep
kill Stop-Process 终止进程 模拟 Linux 下的 kill 命令 Linux 的 kill
clear Clear-Host 清屏 模拟 Linux 下的 clear 命令 Linux 的 clear
echo Write-Output 输出内容 模拟 Linux 下的 echo 命令 Linux 的 echo
touch New-Item 创建新文件 模拟 Linux 下的 touch 命令 Linux 的 touch
type Get-Content 查看文件内容 模拟 CMD 下的 type 命令 CMD 的 type
cls Clear-Host 清屏 模拟 CMD 下的 cls 命令 CMD 的 cls
cd Set-Location 切换目录 模拟 CMD 下的 cd 命令 CMD 的 cd
dir Get-ChildItem 列出文件和目录 模拟 CMD 下的 dir 命令 CMD 的 dir
del Remove-Item 删除文件 模拟 CMD 下的 del 命令 CMD 的 del
rd Remove-Item 删除目录 模拟 CMD 下的 rd 命令 CMD 的 rd
md New-Item 创建目录 模拟 CMD 下的 md 命令 CMD 的 md
ren Rename-Item 重命名文件或目录 模拟 CMD 下的 ren 命令 CMD 的 ren
history Get-History 查看命令历史 模拟 CMD 下的 doskey /history CMD 的 doskey /history
start Start-Process 启动文件/程序 模拟 CMD 下的 start 命令 CMD 的 start
popd Pop-Location 从堆栈中恢复目录 模拟 CMD 下的 popd 命令 CMD 的 popd
pushd Push-Location 将目录压入堆栈 模拟 CMD 下的 pushd 命令 CMD 的 pushd
% ForEach-Object 遍历对象 PowerShell 原生
? Where-Object 过滤对象 PowerShell 原生
gci Get-ChildItem 列出文件和目录 PowerShell 原生
gps Get-Process 获取当前运行的进程信息 PowerShell 原生
gal Get-Alias 查看别名列表 PowerShell 原生
gc Get-Content 读取文件内容 PowerShell 原生
ni New-Item 创建新文件或目录 PowerShell 原生
measure Measure-Object 统计对象数量、总和等 PowerShell 原生
select Select-Object 选择对象的属性 PowerShell 原生
sort Sort-Object 对对象进行排序 PowerShell 原生
fl Format-List 以列表形式显示对象 PowerShell 原生
ft Format-Table 以表格形式显示对象 PowerShell 原生
sls Select-String 查找字符串内容 PowerShell 原生
ogv Out-GridView 图形化方式显示内容 PowerShell 原生
ipcsv Import-Csv 从 CSV 文件导入数据 PowerShell 原生
epcsv Export-Csv 导出数据到 CSV 文件 PowerShell 原生
tee Tee-Object 将输出写入文件并同时输出到控制台 PowerShell 原生
r Invoke-History 运行历史中的命令 PowerShell 原生

powershell.exe(Windows Powershell)

  • 首次发布于2006年,Windows PowerShell 5.1 是基于 .NET Framework 构建的最后一个版本,也是 Windows PowerShell 系列的最终版本。(后续转向开源的Powershell Core)
  • Windows PowerShell 是 Windows 系统自带的命令行 Shell 和脚本语言。
  • 基于 .NET Framework 开发,仅支持 Windows 平台。
  • 虽然功能强大,但由于依赖 .NET Framework,它的跨平台能力和性能相比 PowerShell Core 有所限制。

Windows PowerShell ISE

Windows PowerShell ISE(Integrated Scripting Environment)是一个图形化的脚本编辑和运行环境,专为 Windows PowerShell 用户设计。它集成了脚本编辑、调试和运行功能,使用户可以更轻松地编写、测试和调试 PowerShell 脚本。

Windows PowerShell ISE 是专为 Windows PowerShell(基于 .NET Framework)设计的工具,因此仅支持 Windows 平台。已经停止开发,且不适用于pwsh。

cmd.exe(Command Promote)

  • 首次发布于1987年
  • Command Prompt(命令提示符)是 Windows 系统的传统命令行工具,通常简称为 CMD。
  • Windows 早期的 Shell 环境,提供了 DOS 风格的命令行接口。
  • 支持 .bat 和 .cmd 文件的执行

command.com(MS-DOS Prompt)

  • 首次发布于1980年
  • command.com 是 MS-DOS 的命令行解释器,也是 Windows 9x 系列系统中默认的 Shell。
  • 它是 CMD 的前辈,设计于 16 位环境,功能非常有限。

bash.exe(MinGW Bash)

MinGW(Minimalist GNU for Windows) 是一个工具集,它将一部分常见的 GNU 工具移植到 Windows 平台上,主要用于编译和构建基于 Windows 的程序。

MinGW Bash 是 MinGW 提供的一个命令行工具,它模拟了一个类似于 Linux 环境的 Bash Shell,用于在 Windows 上运行一部分 GNU 命令。

WSL Shell

WSL 提供了一个核心命令行工具 wsl.exe,它允许:

  • 启动默认的 WSL 发行版。
  • 指定启动某个具体的 WSL 发行版(如 Ubuntu、Debian 等)。
  • 执行 Linux 命令或脚本(例如:wsl ls)。
  • 启动 Bash Shell

当运行 wsl 或 wsl.exe 时,WSL 会启动用户安装的 Linux 发行版的默认 Shell(通常是 Bash)。

WindowsTerminal.exe(Windows Terminal)

terminal

  • 首次发布于2019年。
  • Windows Terminal 是微软开发的现代化终端工具,为用户提供统一的命令行体验。
  • 它并不是一个 Shell,而是一个终端模拟器,可以托管多个 Shell 和命令行工具,如 CMD、PowerShell、WSL、Azure CLI 等。
  • 它支持多标签、多主题和 GPU 加速渲染,是现代开发者的首选终端工具。

Windows Terminal 使用一个 JSON 配置文件(settings.json)来定义终端的外观和行为。每种终端环境(如 PowerShell、CMD、WSL Bash)都作为一个单独的 "profile" 被定义在这个配置文件中。通过配置文件,Windows Terminal 可以调用这些环境并在独立的标签页或分屏中运行它们。

conhost.exe(Windows Console)

conhost.exe 是 Console Host(控制台主机),是 Windows Console API 的宿主进程。 它是用来管理和渲染 控制台窗口 的组件,负责处理控制台应用程序的输入输出(如显示文本、处理键盘输入等)。

在早期 Windows 系统(如 XP)中,控制台应用程序(如 cmd.exe)直接与 csrss.exe(Client Server Runtime Process)交互,这是 Windows 的核心系统服务。

从 Windows 7 开始,Microsoft 引入了 conhost.exe,将控制台窗口的管理从 csrss.exe 中分离出来。

配置文件

看看位置

pwsh

  • %UserProfile%\Documents\PowerShell\Profile.ps1
  • %ProgramFiles%\PowerShell\7\Profile.ps1

可以通过如下命令查看具体位置:

1
$PROFILE

比如:anaconda的 conda init 会修改这个文件。

mingw bash

全局配置文件:

  • 通常在 MinGW 安装目录下的 /etc/profile 或 /etc/bash.bashrc。

用户级配置文件,则在用户主目录下的:

  • ~/.bashrc
  • ~/.bash_profile
  • ~/.profile

Windows terminal

  • %LocalAppData%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState

脚本

  • .ps1 中的 ps 代表 PowerShell。数字 1 代表 PowerShell 版本 1.0(这是 PowerShell 的第一个正式版本),后面没再改。
  • .bat 或 .cmd:Windows 批处理脚本文件。(Powershell 通过内部调用cmd可以支持.bat文件)
  • .sh 取自shell,Linux 本身不关注后缀,而且有各种shell存在
特性 .ps1 .bat .sh
运行环境 PowerShell Windows CMD(命令提示符) Linux/Unix(Shell)
适用系统 Windows、Linux、macOS 仅 Windows Linux、macOS(Windows 需工具)
功能 强(支持面向对象和模块化设计) 中(适合简单任务) 强(擅长文本处理和系统管理)
现代化 较低 中等

参考

  • https://en.wikipedia.org/wiki/PowerShell
  • https://en.wikipedia.org/wiki/Cmd.exe
  • https://en.wikipedia.org/wiki/Windows_Terminal
  • https://en.wikipedia.org/wiki/COMMAND.COM
  • https://en.wikipedia.org/wiki/Windows_Console
  • https://github.com/microsoft/terminal
  • https://github.com/PowerShell/PowerShell
  • https://www.mingw-w64.org/

Tools