V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
erquren
V2EX  ›  问与答

Powershell 和 cmd 有什么区别?

  •  
  •   erquren · 2022-05-16 10:02:03 +08:00 · 4913 次点击
    这是一个创建于 911 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在用 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-05-16 10:05:02 +08:00
    “powershell 能用 linux 的命令”是在瞎说,最多也就几个命令如 ls 之类的与 Linux 类似而已。

    powershell 与 cmd 的区别就是,它们是两个不同的命令行环境,就跟 bash 和 zsh 的区别一样,只不过它们都能跑在 Windows 上而已。
    dreasky
        2
    dreasky  
       2022-05-16 10:09:47 +08:00
    建议直接用 wsl
    yaoyao1128
        3
    yaoyao1128  
       2022-05-16 10:18:45 +08:00 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-05-16 10:51:43 +08:00   ❤️ 2
    cmd 在 windows nt 最早的 shell ,从 dos 时代过来的,比较简陋

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

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

    powershell 是可以跨平台的,不过不是跟 unix shell 通用,是巨硬开源了在各大系统的运行环境,在 Linux 上使用得先安装环境。估计主要是 Azure 用户在用跨平台环境吧,库下载排行榜上好几十个是 Az. 开头
    Tumblr
        10
    Tumblr  
       2022-05-16 13:20:19 +08:00
    @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-05-16 14:30:41 +08:00
    @Tumblr 明白你的意思,我知道这个发展背景,我的意思是 powershell 接替 cmd 发展 Windows 的 shell ,不是指替换掉 cmd

    按 Windows 的兼容习惯,cmd.exe 再过 20 年可能都还在,巨硬连 Windows 11 edge 的 ie 模式都承诺至少兼容到 2029
    seeyisee
        12
    seeyisee  
       2022-05-16 14:38:55 +08:00
    比如你输入 pin 然后按 tab 补齐,他俩补齐的内容不一样。powershell 补齐的更丰富。
    flynaj
        13
    flynaj  
       2022-05-16 14:40:06 +08:00 via Android
    powershell 是构建在.net 上面的,功能多,直接调用.net.不过不是每个系统上都有。cmd 所有 Windows 系统上都有。
    Moha
        14
    Moha  
       2022-05-16 14:42:55 +08:00
    前几天我测试我的问题的时候,个别任务,cmd 运行成功,powershell 却失败,离谱
    ladypxy
        15
    ladypxy  
       2022-05-16 14:50:08 +08:00
    powershell 很强大...比所谓的 linux 命令强大的多。。。我用这玩意写过监控系统。。
    gdrk
        16
    gdrk  
       2022-05-16 15:30:23 +08:00
    想知道为啥 powershell 不完全兼容 cmd 的命令啊,前段时间用了 del 命令,cmd 正常执行,powershell 一直报参数错误。
    Howlaind
        17
    Howlaind  
       2022-05-16 15:50:05 +08:00 via Android
    @gdrk 因为本来就没打算兼容呀
    systemcall
        18
    systemcall  
       2022-05-16 18:11:27 +08:00 via Android
    @gdrk 因为本来就只是别名,不是那些命令
    ls 和 dir 在 PowerShell 里是等价的,都是 Get-ChildItem 的别名
    当然如果那个命令是运行了 PATH 环境变量下的程序的话,你会发现基本上是通用的,你在 Windows 下运行 bash 也可以执行那些程序。当然,参数之类的交互上会有一些区别
    haah
        19
    haah  
       2022-05-16 18:13:10 +08:00
    名字不一样!
    bytesfold
        20
    bytesfold  
       2022-05-16 18:38:11 +08:00
    只知道 powershell 很牛逼
    Jiajin
        21
    Jiajin  
       2022-05-16 19:28:33 +08:00
    powershell 挺强的,但是 linux shell 更顺手
    dcsuibian
        22
    dcsuibian  
       2022-05-16 20:43:10 +08:00
    @gdrk powershell 的转义字符是反引号(`),有没有可能是这个的问题?或者其它语法兼容问题?
    我个人遇到的 powershell 出问题的情况有两次,一次是 maven 直接在命令行直接创建项目,一次运行 docker 命令。一直想去学一下 powershell 但没时间。
    dcsuibian
        23
    dcsuibian  
       2022-05-16 21:14:11 +08:00
    用 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-05-16 21:21:19 +08:00
    powershell 的跨平台是后来才有的。现在 windows 上预装的 powershell 还是 windows 上专用的,版本应该是 5.x 。(你打开 powershell 应该能看到更新提示)而最新版本应该是 7.2.3 ,是跨平台的。建议使用最新版,至少解压速度快了一些。

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

    为做出区分。一般前者会被称为 windows powershell 。而后者更多用 pwsh 指代。
    hengxiangbianhua
        25
    hengxiangbianhua  
       2022-05-16 21:26:41 +08:00 via Android
    可识别的路径不一样。cmd 只认\,powershell 可以识别 /
    Buges
        26
    Buges  
       2022-05-16 21:43:59 +08:00 via Android
    @Tumblr 舒服个毛,PowerShell 就是典型的步子迈的太大扯到蛋。看看 elvish/nushell 传统操作系统上的现代 shell 是什么样子的。PowerShell 这么一个 DotNetScript 除非运行在一个完全基于 dotnet 平台构建的操作系统才能名副其实叫 shell 。
    msg7086
        27
    msg7086  
       2022-05-17 02:38:50 +08:00
    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-05-17 11:42:35 +08:00
    @Buges #26 扯到蛋可能是因为自己腿短吧。
    作为 7 8 年的 PowerShell 使用者,多年游荡于 AD 、Exchange 、Azure 、Microsoft 365 及其它微软系产品之间,我个人觉得 PowerShell 用起来很舒服。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1102 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 22:45 · PVG 06:45 · LAX 14:45 · JFK 17:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.