it编程 > 前端脚本 > Powershell

windows为什么有两个命令行工具? PowerShell VS 命令提示符区别对比

232人参与 2024-10-30 Powershell

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

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

查看Windows监听端口占用的两种命令: Netstat或Powershell用法

11-05

linux如何通过crontab命令定时执行shell脚本

10-22

Linux上读取或设置环境和shell变量的教程

10-21

Linux服务器升级GLIBC失败导致shell命令不可用的情况怎么处理

11-18

Ubuntu如何搭建FTP服务器

11-18

Android adb shell dumpsys audio 信息查看分析详解

11-27

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论