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

吐槽一波 powershell

  •  
  •   serialt · 2022-08-10 23:32:48 +08:00 · 3285 次点击
    这是一个创建于 872 天前的主题,其中的信息可能已经有所发展或是发生改变。
    明明 bash 已经很好用了,微软为什么要整出个这么难用的 shell
    30 条回复    2022-08-11 16:57:13 +08:00
    FanyFull
        1
    FanyFull  
       2022-08-10 23:48:55 +08:00 via Android   ❤️ 1
    确实难用。一点也不 power 。
    sky96111
        2
    sky96111  
       2022-08-10 23:56:18 +08:00 via Android
    PowerShell 是一个强大的好工具,但不是一个好 shell
    Osk
        3
    Osk  
       2022-08-10 23:57:00 +08:00   ❤️ 1
    powershell 的 power 体现在管理 Windows 上, 背靠 .Net 平台, 各种 API 丰富, 虽然语法怪怪的, 但用来管理系统是真的方便.

    powershell 管道传对象的设计比 bash 传字符串有一定优势, 毕竟字符串处理不好时容易翻车...
    cmdOptionKana
        4
    cmdOptionKana  
       2022-08-11 00:00:51 +08:00
    主要是缺少一个好教程吧,理论上 powershell 有很多先进的特性,习惯了应该会很好用的。
    ronman
        5
    ronman  
       2022-08-11 00:02:15 +08:00 via Android
    可是 PowerShell 是真的好用啊
    hez2010
        6
    hez2010  
       2022-08-11 00:22:24 +08:00   ❤️ 2
    我反而觉得 powershell 又强大又好用,而 bash 啥都没有。
    powershell 与其说是 shell ,不如说是 shell 语法的 python 。
    比如我需要获取全部的进程列表,然后按照进程名字分组,列出相同进程名的数量和进程 Id ,最后按照进程数量倒排,然后转换成 json ,在 powershell 里面只需要一行:
    Get-Process | group Name | select Name,Count,@{Name='PID';Expression={$_.Group.Id}} | sort -desc Count | ConvertTo-Json
    adoal
        7
    adoal  
       2022-08-11 00:53:03 +08:00 via iPhone
    你把理解为一个取了 shell 之名但实际不是 Unix- alike shell 的.NET-targeted scripting language 就不会难受了
    dcsuibian
        8
    dcsuibian  
       2022-08-11 01:00:06 +08:00
    如果是在 linux/mac 上,那确实不好用。(跨平台 shell 只是个美好的梦)但如果在 Windows 上,是十分好用的。

    1 、PowerShell 背靠.NET 平台,它值是有类型的,而 bash 则只是处理文本。PowerShell 相对来说更接近编程语言,有着更加强大的操控力,比如 (Get-Service win32Time).Stop() 这种,就是方法调用的形式。
    2 、bash 字符串的操作方式,总让我有种不稳定感。比如通过分割一行然后截取第 n 段字符串的方式,就没有 PowerShell 的直接使用属性名那样有确定性。
    3 、PowerShell 统一的 Verb-Noun 的命令形式,以及完整的参数命名。让人明白它想干啥。
    比如 tail -f 对比 Get-Content -Wait ,后者虽然打的东西多了,但更加清晰明显。(感觉就像 C 和 Java )
    4 、微软的东西,风格非常统一。Linux 上面有很多系统组件是由不同的人 /组织提供的,但 Windows 上微软提供的组件占了很大的份额。这使得你用 PowerShell 去与微软的东西交互,会十分得舒服。
    nicegp
        9
    nicegp  
       2022-08-11 03:07:02 +08:00 via Android
    PowerShell 敢起这个名字不是没有道理的 真的好用
    Aloento
        10
    Aloento  
       2022-08-11 03:22:11 +08:00
    很好用的 ps1
    ShinichiYao
        11
    ShinichiYao  
       2022-08-11 08:48:58 +08:00
    可怜的扩展名被 Photoshop 用掉了,只能用 ps1
    shakoon
        12
    shakoon  
       2022-08-11 09:03:44 +08:00
    powershell 简直不要再好用,调用系统的 api 不要太方便,而一般 bash 只能调用各种命令进行组合,复杂功能要么实现不了要么只能写出及其啰嗦的代码。
    作为一个 20 年前从 vb 、asp 开始入门 Windows 编程的人表示 ps 入门毫无门槛。
    DAPTX4869
        13
    DAPTX4869  
       2022-08-11 09:08:25 +08:00
    用着马马虎虎, 不过教程是真的少
    iloveayu
        14
    iloveayu  
       2022-08-11 09:15:24 +08:00
    如果在 Windows 平台,目前除了 ps 也没得选啊,管道是非常好用的。
    eason1874
        15
    eason1874  
       2022-08-11 09:16:24 +08:00
    “明明 bash 已经很好用了”

    zsh 、python 、powershell 表示:这是我听过最好笑的笑话
    shakoon
        16
    shakoon  
       2022-08-11 09:17:08 +08:00
    倒是最近我在办公室电脑遇到一个与 powershell 相关的烦人问题。
    该 pc 安装了联软的桌面安全助手软件,每隔几秒钟就会调用一下 ps 执行 Get-AppxPackaqe -AllUsers ,造成较大的 cpu 占用。我已经在组策略里设置了禁用 powershell.exe 、powershell_ise.exe ,但是这玩意居然只对用户自己生效,安全助手还是能调用。如果把 AppXSvc 服务禁用,ps 还是能被调用,但是进程会卡住,过一段时间后任务管理器能看到一排 ps - -#
    marcong95
        17
    marcong95  
       2022-08-11 10:13:31 +08:00
    那你倒是吐槽一下具体哪里不好用啊。。。

    把各种 shell 当工具用一只前端表示,bash shell 那种奇奇怪怪的语法,每次用都要翻一下 learnxinyminute 。Powershell 的语法起码现代得多。
    Tumblr
        18
    Tumblr  
       2022-08-11 10:44:58 +08:00   ❤️ 2
    作为一个从 2014 或者 2015 就开始接触 PowerShell 的玩家来说,OP 要么是人笨怪刀钝,要么是无病呻吟找话题赚回复金币。
    chouchoui
        19
    chouchoui  
       2022-08-11 10:50:24 +08:00
    有部分程序员双标起来就是这样的,非微软出品有点什么新东西都能吹都要学,只要微软出品体验不一样了就不学了只会骂垃圾。
    lovedebug
        20
    lovedebug  
       2022-08-11 10:53:30 +08:00
    设计理念不一样啊,所以思维方式不一样,但是 PowerShell 真的好用啊 😂
    ColorfulBoar
        21
    ColorfulBoar  
       2022-08-11 11:21:06 +08:00
    既然 bash 这么好用,希望你以后写别的语言的时候主动禁用除字符串以外的所有非函数类型,所有的函数类型都是 string->string ,永远只传一个字符串进去然后用自己绝世的字符串处理技巧手动解析出需要的信息,最后再把需要返回的信息编码成一个新字符串返回

    另外这种能觉得 bash 是个好东西的审美……真的强烈推荐尝试一下 C 和 Go ,你一定会喜欢的!
    (无奖竞猜:这三个的共同点是____
    serialt
        22
    serialt  
    OP
       2022-08-11 11:27:27 +08:00   ❤️ 1
    @Tumblr 只是吐槽,linux bash 已经多年,一用 windows 的 cmd 或者 ps 就很难受,没办法,只好装 git bash 或者 wsl2
    wxf666
        23
    wxf666  
       2022-08-11 11:42:10 +08:00
    @hez2010 虽说 bash 很难用,但也不至于这么点儿任务都干不了

    我仿照 powershell 的结果写了一个,结果一样(模仿格式导致写得冗余)

    ps h -eo pid,comm | jq -Rs '[capture(" *(?<pid>[0-9]*) *(?<name>.*)\n"; "g")] | group_by(.name) | sort_by(-length) | map({Name: .[0].name, Count: length, PID: (if length > 1 then {value: [.[].pid | tonumber], Count: length} else .[0].pid end)})'


    我觉得 bash 适合交互和简单脚本,再复杂就适合上编程语言了

    powershell 似乎适合当编程语言?
    Tumblr
        24
    Tumblr  
       2022-08-11 12:10:41 +08:00
    @serialt #22 其实是个习惯问题了。我是从 Windows 起步的,也玩过 Linux ,也玩过 macOS ,目前 PowerShell/pwsh 、bash 、pwsh for Mac 几乎无缝切换~
    不过说到这个了,我玩 Linux 的时候玩 CentOS 比较多,所以一直觉得 yum 正宗,apt 异类!

    @wxf666 #23 其实做横向比较的意义不是太大啦,每种语言的存在都是各有千秋的。
    PowerShell 并不适合当编程语言,只是脚本语言,但背靠 .net ,如果是玩 .net 或者 C#,用 PowerShell 的时候确实门槛超级低,很容易入手。
    xuboying
        25
    xuboying  
       2022-08-11 12:12:39 +08:00
    感觉 powershell 作为 shell 是真的。。。
    作为编程工具不知道为何不直接用 python 。。。毕竟 python 慢慢编程全民语言了。。。
    Crabby
        26
    Crabby  
       2022-08-11 12:16:55 +08:00   ❤️ 1
    @DAPTX4869
    Mastering Windows PowerShell Scripting: Automate and manage your environment using PowerShell Core 6.0, 3rd Edition
    作者 Chris Dent. 这本不错.
    nicevar
        27
    nicevar  
       2022-08-11 12:20:52 +08:00
    psh 会用就好用,不会用就难用,不会比 bash 差,说不好用的往往是两者都用不好的半桶水
    dcsuibian
        28
    dcsuibian  
       2022-08-11 12:25:32 +08:00 via Android
    @serialt 我猜测,你有认真学过 Linux ,而 Windows 却是直接上手用,这可不公平啊
    skinny
        29
    skinny  
       2022-08-11 12:28:53 +08:00
    跟 bash 比,powershell 好用,就是启动很多时候不够快。PowerShell 封装了太多系统管理功能和 API 给你调用,而且背靠 dotnet ,你甚至可以混 C#代码在里面,还可以通过 P/Invoke 调用各种动态库提供的 API 。

    当然了,PowerShell 也有很多瑕疵(没有完美的语言),比如返回值你不赋值到变量或通过管道扔给 out-null ,他会返回给外部,你不注意就有很多命令结果隐式当成返回值返回了,我不喜欢这个风格,我觉得这算瑕疵,我要返回啥就会明确写。
    Ei1l
        30
    Ei1l  
       2022-08-11 16:57:13 +08:00
    powershell 底层是.net.....能搞出花来.我就是用这个来挂一些简单脚本
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1162 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:54 · PVG 01:54 · LAX 09:54 · JFK 12:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.