从传统的
cmd.exe
到Windows 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.exe
是 PowerShell 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 |
|
- 输出是一个对象列表,每个文件或文件夹是一个 System.IO.FileInfo 或 System.IO.DirectoryInfo 对象。
- 这些对象包含丰富的元数据,例如文件名称、大小、创建时间等。
1 2 3 4 |
|
可以直接访问这些对象的属性,例如文件名和大小
1 |
|
可能这样更直观
1 2 |
|
别名
别名是一种对完整命令(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)
- 首次发布于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 |
|
比如: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/