作为普通的 Windows 用户,在通常情况下都不太会用到命令行界面。但要执行高级任务,命令行通常会赋予用户更多的操控功能和灵活性。而 Windows 系统中提供了命令提示符PowerShell 两种命令行工具,乍看之下 PowerShell 和命令提示符非常相似,实则两者之间有非常显著之差异。本文中,我们将对命令提示符和 PowerShell 都进行简要介绍。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

什么是命令提示符

命令提示符是微软从 Windows NT (Windows NT 3.x 及之后版本) 便开始提供的默认命令行界面,它其实是一个 Win32 应用程序,使用它我们可通过 Win32 类与操作系统进行交互。命令提示符提供了非常友好命令结构,可被用于执行批处理文件、协助 Windows 排错及执行其它高级操作。

提示:由于命令提示符界面与 MS-DOS 的黑窗口太过相似,很多人误称为 DOS,这种说法其实是错误的。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

什么是PowerShell

PowerShell 基于 .NET framework,其第一个版本于 2006 年发布,功能比命令提示符强大和先进很多,其功能特性包括:管道输出、自动任务及远程执行等。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

由于 PowerShell 与 Windows 操作系统深度集成,同时提供了命令行及脚本语言的交互方式,因此它常被系统管理员和 IT Pro 用于执行自动化任务和配置管理。

PowerShell与命令提示符有何不同

PowerShell 相比命令提示符提供了更多的功能特性和更好的性能,事实上几乎所有(但不仅限于) Windows 模块都可以使用 PowerShell 进行管理,而命令提示符是做不到的,所以它都会成为系统管理员的神兵利器。

虽然提到 PowerShell 大多数人首先还是会想到标准的命令行界面,但不要忘了 Windows 中还附带了 PowerShell ISE(集成开发环境),它可以帮助我们快速创建和订制各种复杂的 PowerShell 脚本。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

说白了,本文的目的是想让广大管理员尽可能的都学习 PowerShell,毕竟命令提示符在大模型环境管理中能为我们做的太有限了。

技术层面介绍:

Windows的两个命令行工具,他们都可以用来人机交互, 并提供一个用于自动化 IT 操作的环境。  

CMD  Shell 是最早内置于 Windows 中的 Shell,用于执行windows命令,执行批处理文件这里指的是(.bat)文件,还有执行自动化任务等功能。

PowerShell 的设计目的是扩展CMD  Shell 的功能,可以运行称为 cmdlet 的 PowerShell 命令。Cmdlet 类似于 Windows 命令,但提供了更多可扩展的脚本语言功能。您可以在 PowerShell 中运行 Windows 命令和 PowerShell 专属的cmdlet,但CMD Shell 只能运行 Windows 命令,不能运行 PowerShell cmdlet。

事实上 cmd是老旧的DOS操作系统继承来的产物,所以他的功能十分有限,你输入命令,windows执行命令仅此而已。然而 Power Shell 不但是更蓝了,也更强了。除了能执行普通的window命令外,他还是一个完整的脚本语言运行环境。

比如我在cmd里面敲击 1+1回车,由于这不是一个window命令 cmd完全不懂要干什么,直接报错。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

然而powershell 作为一个编程环境,他明白1+1应该进行数字运算,所以输出了2。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

powershell里面也可以定义变量,定义函数。这其实很像一些高级编程语言的命令行交互环境了,比如python。

其实powershell完全可以作为cmd 命令行的上位替代。事实上在win11版本,桌面点击右键,默认的命令行工具就是powershell

cmdlet

Cmdlet这个单词 是 "command-let" 的缩写,是一种专门在 Windows PowerShell 中使用的命令。Cmdlet 是由 .NET  库编写的。

Cmdlet 的命名遵循 "动词-名词" 的格式,例如 Get-Process故名思议就是获取当前进程, 或 Set-Location意思是切换目录。 这时候你也许会好奇,window已经有了cd命令 为什么又要发明一种又臭又长的 Set-Location命令呢。

事实上 PowerShell 的 Set-Location 不仅仅能用于更改文件的目录,还可以用于更改其他东西(如注册表目录、证书存储目录等)。这使得 PowerShell 的 Set-Location 比传统的 cmd 中的 cd 更强大。  传统的 Windows 命令通常返回纯文本输出,这使得对输出进行解析和处理变得困难。而 PowerShell 的 Cmdlet 返回 .NET 对象,允许更复杂和精确的数据操作。这种对象模型使得数据在管道中传递时,能够保留其结构。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

为了让Powershell 能完全兼容旧版本的cmd命令,微软发明了一种 Alias别名的机制,旧版cmd命令在  powershell中都通过别名连接到一个cmdlet命令。比如在powershell中 cd就是 Set-Location的别名,他们两个在powershell中是完全等价的。在powershell中输入cd 也就的等于输入 Set-Location。

这里要注意一点,cmd中的cd与powershell中的cd虽然长得一样,功能也类似,但是底层实现机制已经有了本质区别,前者是一个简单的windows命令,后者是一个cmdlet。

我们可以用Get-Alias命令来查看所有的别名关系。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

这个Get-Alias表格也不全是旧版的cmd命令,其中还吸纳了一些Linux命令,比如ls。

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比-风君雪科技博客

我们在cmd输入ls,直接报错,因为ls不是windows命令。但是powershell输入ls则会显示当前目录文件。因为ls 与  Get-ChildItem是别名关系。如果你熟悉Linux命令的,可能感到狂喜,因为好多命令都是通用的,又减少了一部分学习成本。

综上所述cmd用户可以无缝过渡到powershell,不用支付任何学习成本,Linux用户也可以丝滑学习使用powershell,因为好多命令都是通用的。   因此powershell完全可以作为cmd 命令行的上位替代,用惯了cmd的各位不妨都来学习下powershell。

管道符

| 这个竖线是管道符,意思是把上个命令的输出结果作为下个命令的输入,可以像拼接管道一样把命令拼接起来,形成一条流水线。由于cmdlet返回的是一个.net对象,可以很方便的使用管道符进行命令拼接。

我举几个例子带大家感受一下

获取前五个CPU占用率最高的进程

Get-Process | Sort-Object CPU -Descending | Select-Object -First 5

Windows目录下所有可执行文件exe的大小是多少?

Get-ChildItem $env:windir -Filter *.exe | Measure-Object -Sum Length

假设有一个 CSV 文件 data.csv,其中包含用户信息。你想要筛选出年龄大于 30 的用户

然后转成html格式,最后输出到output.html文件

Import-Csv data.csv | Where-Object {$_.Age -gt 30} | ConvertTo-Html | Out-File output.html

脚本编程

powershell 与 cmd 其实都可以编写脚本程序。 cmd是脚本文件的扩展名是bat 而powershell的扩展名则是ps1。但是bat程序比较难写, 比起ps1的多了很多很多局限性。 比如bat文件中甚至不允许if嵌套。

比如这个bat脚本,由于不允许if嵌套,只能用使用goto语句代替,代码逻辑go来go去,简直不是人读的。

@echo off
setlocal
set var1=1
set var2=2
if %var1%==1 goto FirstLevelMet
goto End
:FirstLevelMet
echo First level condition met
if %var2%==2 goto SecondLevelMet
goto End
:SecondLevelMet
echo Second level condition met
:End
pause

powershell则更像一个现代编程语言

可以使用括号与嵌套if 更直观表示代码层级,代码行数直接砍半。

$var1 = 1
$var2 = 2
if ($var1 -eq 1) {
    Write-Output "First level condition met"
    if ($var2 -eq 2) {
        Write-Output "Second level condition met"
    }
} 

所以编写复杂的windows批处理程序,我建议还是直接用powershell,可以极大减轻程序员的痛苦指数。

cmdlet补充

我来补充几个powerShell的cmdlet的功能,cmd一般没有这些功能。

# 查看所有支持的命令
Get-Command
# 更新帮助文档
Update-Help
# 获取帮助
Get-Help <cmdlet>
## 以下是跟Linux完全相同的命令
## 如果你熟悉Linux,就仿佛回到家了
# 清屏
clear
# 获取当前目录
pwd
# 列出当前目录所有文件
ls
# 查看文件
cat <filename>
# 创建文件夹
mkdir <dirname>
# 移动文件
mv  <filename> <dirname>
# 复制文件
cp  <filename> <dirname>
# 删除
rm  <filename>
#输出到CSV
export-csv  -Path <filename>
# 当前进程到出到csv文件
ps | export-csv -Path test.csv
# 导出html
ps | convertto-html > test.html
#文件修改
# 追加
add-content <filename>  <content>
# 覆盖
set-content <filename>  <content>

总结今天的内容 ,Windows Power Shell 不但是更蓝了,也更强了。除了能执行普通的window命令外,他还是一个完整的脚本语言运行环境。因此powershell是cmd 命令行的上位替代,用惯了cmd的各位不妨来学习下powershell,你会发现一个新的世界。