erquren
V2EX  ›  问与答

Powershell 和 cmd 有什么区别?

By erquren at 2022 年 5 月 16 日 · 6305 次点击
最近在用 pycharm 的时候发现 terminal 无法自动匹配 conda 环境,因为新版本的 pycharm 默认使用 powershell 作为终端环境了,无法初始化 conda ,切换为 cmd 后解决问题

遂查询了下 powershell 和 cmd 的区别,说 powershell 能用 linux 的命令,可以跨平台使用,但是有什么情况需要跨平台使用?在 linux 下用 powershell ?不是很懂。
28 条回复  •  2022-05-17 11:42:35 +08:00
villivateur
   1
villivateur  
   2022 年 5 月 16 日
“powershell 能用 linux 的命令”是在瞎说,最多也就几个命令如 ls 之类的与 Linux 类似而已。

powershell 与 cmd 的区别就是,它们是两个不同的命令行环境,就跟 bash 和 zsh 的区别一样,只不过它们都能跑在 Windows 上而已。
dreasky
   2
dreasky  
   2022 年 5 月 16 日
建议直接用 wsl
yaoyaomoe
   3
yaoyaomoe  
   2022 年 5 月 16 日 via iPhone
powershell 的.net 构建的 cmdlet 的话很多别名是和 unix shell 与 cmd 兼容 但是本身的 cmdlet 更偏向自然语言
基于.net 让 ps 多了很多功能与能力 也有很多奇奇怪怪的用法
一定程度上可以说没有 powershell 的话,win server core 和当年的 iot 版本都不会出现

奇怪的用法参见 https://www.v2ex.com/t/828462
eason1874
   4
eason1874  
   2022 年 5 月 16 日   ❤️ 2
cmd 在 windows nt 最早的 shell ,从 dos 时代过来的,比较简陋

后来新出 powershell 接替 cmd ,两者区别大概有 ie 和 edge 那么大
lithiumii
   5
lithiumii  
   2022 年 5 月 16 日
初始化 conda 只要跑到 conda 那个文件夹里手动运行一下 init 就可以了吧
creanme
   6
creanme  
   2022 年 5 月 16 日
“powershell 能用 linux 的命令” 只是因为 powershell 官方内置了少量的 alias ,比如 ls 是 Get-ChildItem 的 alias 。
erquren
   7
erquren  
OP
   2022 年 5 月 16 日
@lithiumii pycharm 会自动在终端初始化 conda 环境,在 cmd 下可以,ps 下就不行,不知道是不是权限问题

@eason1874 不知道是老款 edge 还是 chrome 内核的 edge
wangsyi13
   8
wangsyi13  
   2022 年 5 月 16 日
@erquren 是不是 ps 的执行脚本权限没开
eason1874
   9
eason1874  
   2022 年 5 月 16 日
@erquren 那肯定是 chrome 同款内核的 edge ,区别才够大。powershell 已经超越壳的功能了,有 .net 环境,我看到好些人拿它当 python 用,开本地 http server 、处理图片什么的

powershell 是可以跨平台的,不过不是跟 unix shell 通用,是巨硬开源了在各大系统的运行环境,在 Linux 上使用得先安装环境。估计主要是 Azure 用户在用跨平台环境吧,库下载排行榜上好几十个是 Az. 开头
Tumblr
   10
Tumblr  
   2022 年 5 月 16 日
@eason1874 #4 啊。。。无意冒犯但这个是典型的以讹传讹的传言,PowerShell 的出现本来就没有取代 cmd 的意思。当年 Jeffrey Snover 想在 Windows 上弄套 Unix 工具,但是后来发现这玩意儿行不通,然后就半路改道,单独弄了一套东西出来,就是后来的 Windows PowerShell 。
只是 PowerShell 这东西和 cmd 同在 Windows 上,并且 PowerShell 感觉更 morden ,所以微软也在倾向于把 PowerShell 做成默认,作为 cmd 的升级了,然后上就让人觉得当初 PowerShell 的出现是为了替换掉 cmd 。
其实我觉得这是个好现象,反正 CLI 的东西本来也不是给普通用户的,对于 IT Pros 来说,用一个更现代的 shell 确实比折腾 cmd 里的字符串要舒服太多太多了。
eason1874
   11
eason1874  
   2022 年 5 月 16 日
@Tumblr 明白你的意思,我知道这个发展背景,我的意思是 powershell 接替 cmd 发展 Windows 的 shell ,不是指替换掉 cmd

按 Windows 的兼容习惯,cmd.exe 再过 20 年可能都还在,巨硬连 Windows 11 edge 的 ie 模式都承诺至少兼容到 2029
seeyisee
   12
seeyisee  
   2022 年 5 月 16 日
比如你输入 pin 然后按 tab 补齐,他俩补齐的内容不一样。powershell 补齐的更丰富。
flynaj
   13
flynaj  
   2022 年 5 月 16 日 via Android
powershell 是构建在.net 上面的,功能多,直接调用.net.不过不是每个系统上都有。cmd 所有 Windows 系统上都有。
Moha
   14
Moha  
   2022 年 5 月 16 日
前几天我测试我的问题的时候,个别任务,cmd 运行成功,powershell 却失败,离谱
Dragonish3600
   15
Dragonish3600  
   2022 年 5 月 16 日
powershell 很强大...比所谓的 linux 命令强大的多。。。我用这玩意写过监控系统。。
gdrk
   16
gdrk  
   2022 年 5 月 16 日
想知道为啥 powershell 不完全兼容 cmd 的命令啊,前段时间用了 del 命令,cmd 正常执行,powershell 一直报参数错误。
Howlaind
   17
Howlaind  
   2022 年 5 月 16 日 via Android
@gdrk 因为本来就没打算兼容呀
systemcall
   18
systemcall  
   2022 年 5 月 16 日 via Android
@gdrk 因为本来就只是别名,不是那些命令
ls 和 dir 在 PowerShell 里是等价的,都是 Get-ChildItem 的别名
当然如果那个命令是运行了 PATH 环境变量下的程序的话,你会发现基本上是通用的,你在 Windows 下运行 bash 也可以执行那些程序。当然,参数之类的交互上会有一些区别
haah
   19
haah  
   2022 年 5 月 16 日
名字不一样!
bytesfold
   20
bytesfold  
   2022 年 5 月 16 日
只知道 powershell 很牛逼
Jiajin
   21
Jiajin  
   2022 年 5 月 16 日
powershell 挺强的,但是 linux shell 更顺手
dcsuibian
   22
dcsuibian  
   2022 年 5 月 16 日
@gdrk powershell 的转义字符是反引号(`),有没有可能是这个的问题?或者其它语法兼容问题?
我个人遇到的 powershell 出问题的情况有两次,一次是 maven 直接在命令行直接创建项目,一次运行 docker 命令。一直想去学一下 powershell 但没时间。
dcsuibian
   23
dcsuibian  
   2022 年 5 月 16 日
用 conda init powershell 应该就好了。
初次接触 powershell 是在校验 iso 文件时,不想下个专门的软件 hash ,于是搜到了 Get-FileHash 命令。从此就没怎么用过 cmd 了。

1 、基本上我就当是个加强版的 cmd 。cmd 太老了,也没在更新,各种功能残缺不全。

2 、用 Linux 的写法是不正确的,因为它实际上还是 powershell 上专有的命令,只不过使用了别名罢了。
Get-Alias ls
Get-Alias rm
你就能看到实际的 powershell 命令了。

3 、不过相比 cmd 而言,powershell 肯定是对 linux 惯用者更友好的。毕竟 cmd 经常会:
'ls' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
cmd 中也没法使用(~)指代家目录。补全功能也弱。

4 、跨平台这个还是不要想了。Linux 和 Windows 差别还是很大的。比如目录的权限信息就不一样。
你搜 powershell 搜到的大部分还是 windows 运维资料,而命令行使用命令的不一定是 shell 自带的,比如 windows 自带 robocopy ,我在 mac 上的装了 powershell 也没法用。Linux 用户基本上不会装 powershell 。所以“跨平台”聊胜于无。

总之你就直接拿来替代掉 cmd 就对了,总比它强。遇到语法不兼容的问题,临时还可以。
> cmd
> 你执行的指令
> exit
这样嘛
dcsuibian
   24
dcsuibian  
   2022 年 5 月 16 日
powershell 的跨平台是后来才有的。现在 windows 上预装的 powershell 还是 windows 上专用的,版本应该是 5.x 。(你打开 powershell 应该能看到更新提示)而最新版本应该是 7.2.3 ,是跨平台的。建议使用最新版,至少解压速度快了一些。

可以通过输入
$PSVersionTable
查看版本信息。

为做出区分。一般前者会被称为 windows powershell 。而后者更多用 pwsh 指代。
hengxiangbianhua
   25
hengxiangbianhua  
   2022 年 5 月 16 日 via Android
可识别的路径不一样。cmd 只认\,powershell 可以识别 /
Buges
   26
Buges  
   2022 年 5 月 16 日 via Android
@Tumblr 舒服个毛,PowerShell 就是典型的步子迈的太大扯到蛋。看看 elvish/nushell 传统操作系统上的现代 shell 是什么样子的。PowerShell 这么一个 DotNetScript 除非运行在一个完全基于 dotnet 平台构建的操作系统才能名副其实叫 shell 。
msg7086
   27
msg7086  
   2022 年 5 月 17 日
PowerShell 可以当成一个基于 dotnet/C#的交互 Shell 。
有点像 Python 的交互命令行或者 Ruby 的 IRB 。
(比如你在 IRB 里也可以 mv 'a.txt', 'b.txt' 这样操作嘛。)
不过 PowerShell 特意优化了作为 Shell 的功能,让他可以从 PATH 里直接调用应用程序,又可以用内置的 cmdlet (相当于 cmd 的内置命令)来实现原生调用 dotnet 的功能。

当然反过来说,用起来不如普通的 Shell 那么简洁,要背诵记忆的命令和参数长了很多,和已经熟知的 Linux Shell 相比,需要一定的入门学习时间。

@ladypxy
用 PowerShell 写项目基本相当于用 C#写脚本了,功能当然是 Linux 命令集不能比的。
Tumblr
   28
Tumblr  
   2022 年 5 月 17 日
@Buges #26 扯到蛋可能是因为自己腿短吧。
作为 7 8 年的 PowerShell 使用者,多年游荡于 AD 、Exchange 、Azure 、Microsoft 365 及其它微软系产品之间,我个人觉得 PowerShell 用起来很舒服。
© 2026 V2EX · 67ms · 3.9.8.5