232人参与 • 2024-10-30 • Powershell
作为普通的 windows 用户,在通常情况下都不太会用到命令行界面。但要执行高级任务,命令行通常会赋予用户更多的操控功能和灵活性。而 windows 系统中提供了命令提示符和 powershell 两种命令行工具,乍看之下 powershell 和命令提示符非常相似,实则两者之间有非常显著之差异。本文中,我们将对命令提示符和 powershell 都进行简要介绍。
命令提示符是微软从 windows nt (windows nt 3.x 及之后版本) 便开始提供的默认命令行界面,它其实是一个 win32 应用程序,使用它我们可通过 win32 类与操作系统进行交互。命令提示符提供了非常友好命令结构,可被用于执行批处理文件、协助 windows 排错及执行其它高级操作。
提示:由于命令提示符界面与 ms-dos 的黑窗口太过相似,很多人误称为 dos,这种说法其实是错误的。
powershell 基于 .net framework,其第一个版本于 2006 年发布,功能比命令提示符强大和先进很多,其功能特性包括:管道输出、自动任务及远程执行等。
由于 powershell 与 windows 操作系统深度集成,同时提供了命令行及脚本语言的交互方式,因此它常被系统管理员和 it pro 用于执行自动化任务和配置管理。
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这个单词 是 "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,可以极大减轻程序员的痛苦指数。
我来补充几个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,你会发现一个新的世界。
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论