作为普通的 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,你会发现一个新的世界。
发表评论