作为普通的 Windows 用户,在通常情况下都不太会用到命令行界面。但要执行高级任务,命令行通常会赋予用户更多的操控功能和灵活性。而 Windows 系统中提供了命令提示符和 PowerShell 两种命令行工具,乍看之下 PowerShell 和命令提示符非常相似,实则两者之间有非常显著之差异。本文中,我们将对命令提示符和 PowerShell 都进行简要介绍。
什么是命令提示符
命令提示符是微软从 Windows NT (Windows NT 3.x 及之后版本) 便开始提供的默认命令行界面,它其实是一个 Win32 应用程序,使用它我们可通过 Win32 类与操作系统进行交互。命令提示符提供了非常友好命令结构,可被用于执行批处理文件、协助 Windows 排错及执行其它高级操作。
提示:由于命令提示符界面与 MS-DOS 的黑窗口太过相似,很多人误称为 DOS,这种说法其实是错误的。
什么是PowerShell
PowerShell 基于 .NET framework,其第一个版本于 2006 年发布,功能比命令提示符强大和先进很多,其功能特性包括:管道输出、自动任务及远程执行等。
由于 PowerShell 与 Windows 操作系统深度集成,同时提供了命令行及脚本语言的交互方式,因此它常被系统管理员和 IT Pro 用于执行自动化任务和配置管理。
PowerShell与命令提示符有何不同
PowerShell 相比命令提示符提供了更多的功能特性和更好的性能,事实上几乎所有(但不仅限于) Windows 模块都可以使用 PowerShell 进行管理,而命令提示符是做不到的,所以它都会成为系统管理员的神兵利器。
虽然提到 PowerShell 大多数人首先还是会想到标准的命令行界面,但不要忘了 Windows 中还附带了 PowerShell ISE(集成开发环境),它可以帮助我们快速创建和订制各种复杂的 PowerShell 脚本。
说白了,本文的目的是想让广大管理员尽可能的都学习 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完全不懂要干什么,直接报错。
然而powershell 作为一个编程环境,他明白1+1应该进行数字运算,所以输出了2。
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 对象,允许更复杂和精确的数据操作。这种对象模型使得数据在管道中传递时,能够保留其结构。
为了让Powershell 能完全兼容旧版本的cmd命令,微软发明了一种 Alias别名的机制,旧版cmd命令在 powershell中都通过别名连接到一个cmdlet命令。比如在powershell中 cd就是 Set-Location的别名,他们两个在powershell中是完全等价的。在powershell中输入cd 也就的等于输入 Set-Location。
这里要注意一点,cmd中的cd与powershell中的cd虽然长得一样,功能也类似,但是底层实现机制已经有了本质区别,前者是一个简单的windows命令,后者是一个cmdlet。
我们可以用Get-Alias命令来查看所有的别名关系。
这个Get-Alias表格也不全是旧版的cmd命令,其中还吸纳了一些Linux命令,比如ls。
我们在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,你会发现一个新的世界。