V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
iorilu
V2EX  ›  程序员

无意中学了点 powershell ,惊了, 这东西是不是低估了

  •  1
     
  •   iorilu · 2023-08-27 14:48:57 +08:00 · 19778 次点击
    这是一个创建于 479 天前的主题,其中的信息可能已经有所发展或是发生改变。

    以前以为 shell 都是 bash 之类那种

    来来回回就是调点命令,用管道串联几个命令

    来来回回都是处理文本, 别提多麻烦, 还有一些诡异语法之类的 awk

    大家都默认这样就不错

    最近因为一些用途, 了解了点 powershell

    立马惊了,powershell 命令输出的都是真正的对象, 直接 相当于管道处理对象, 不需要折腾命令数着几列到几列处理文本, 既然是对象, 直接拿属性, 调用方法都行, 方便太多

    而且 powershell 现在跨平台, 开源了, 感觉微软一出手, 开源真没人玩的过啊

    我打算以后 mac , 或 linux 上也用 powershell 了

    有兴趣的可以了解下

    135 条回复    2023-08-31 00:48:53 +08:00
    1  2  
    liuidetmks
        101
    liuidetmks  
       2023-08-28 12:03:26 +08:00
    没深入了解 ps ,
    如果是第三方程序,如何传输对象呢?是不是还得看文档

    如果是文本的话,自己看就可以大概处理了
    e3c78a97e0f8
        102
    e3c78a97e0f8  
       2023-08-28 15:51:45 +08:00 via iPhone
    @qishouvip2022 你学透了就觉得高效,对于没接触过的人这学习成本太高了。
    sky96111
        103
    sky96111  
       2023-08-28 16:00:43 +08:00
    @sky96111 看评论怎么感觉大家的 shell 更多是作为脚本解释器来使用,而不是交互使用呢?
    iorilu
        104
    iorilu  
    OP
       2023-08-28 16:30:59 +08:00
    @liuidetmks 我也没深入了解

    但有很多三方模块可以安装

    https://www.powershellgallery.com/

    都可以传对象的, 应该是按规范编码, 就可以传自定义对象

    powershell 模块一般都有不错的帮助文件
    vhwwls
        105
    vhwwls  
       2023-08-28 16:52:08 +08:00
    @iorilu 你低估了 Linux 生态对 bash 的依赖性,有大量的各种各样的脚本只能跑在 bash 上,你可以在 Linux 上把 powershell 当成默认 shell 用一段时间,就知道为什么这玩意注定没办法替代 bash 了。
    NessajCN
        106
    NessajCN  
       2023-08-28 16:52:42 +08:00
    @qishouvip2022 find /your/path -type f -name '*test*.doc' -mtime 3
    leeg810312
        107
    leeg810312  
       2023-08-28 17:51:50 +08:00
    从功能来说,我觉得 powershell 是很强大的,只是从生态和习惯角度,不易被非 windows 平台用户接受,而且由于生态,跨平台兼容性也是在运行时,有些部署运维脚本不方便用,只有 sh 脚本。另外还有就是微软产品鄙视党了,这已经超出技术范围了。
    antonius
        108
    antonius  
       2023-08-28 18:00:34 +08:00
    强大确实是强大,复杂也是真的复杂。个人感觉 bash 和 zsh 恰好处于 cmd 和 powershell 的中间的状态,重要的是命令短,交互输入也比 powershell 简洁方便。
    sariya
        109
    sariya  
       2023-08-28 18:07:00 +08:00 via Android
    可能是没系统学过,总觉得 ps 的命令参数形式摸不着头脑
    LindsayZhou
        110
    LindsayZhou  
       2023-08-28 22:08:16 +08:00
    @zictos #6 单行里面写循环我一般习惯用 map
    python -c "list(map(lambda i: print(i) if i<10 else None, range(100)))"
    这样
    zictos
        111
    zictos  
       2023-08-29 04:40:40 +08:00 via Android
    @LindsayZhou 我那是举例,主要是说明无论多复杂的代码或多重嵌套都可以写成单行命令,单行字符串加 exec 函数
    msg7086
        112
    msg7086  
       2023-08-29 07:08:09 +08:00
    「强大」不总是好事。这就像问,汇编速度又快功能又强,什么都能做,又什么都做得很快,为什么不是人人都用呢。那总是有短板的,学习曲线高。为什么用 bash 之类的 shell ,就是因为输入输出功能「不强大」,是纯字符串,所以只要记住字符串处理,而非记住所有的对象结构,学习难度差很多。

    就像 unix 下的设计原则,万物都是文件一样。你看到 windows 的设计,哇什么都是对象。但是每个对象都有自己的结构,而文件呢,任何 linux 工具都能够轻松处理。

    什么东西都是字符串有一个好处,就是进程间通讯会简单很多。如果你在 powershell 里调用第三方程序,返回的还是字符串,又不会是对象。

    如果要处理更复杂的逻辑,那直接用 python 就好了,Linux 一般都内置了,Windows 下安装也简单。
    iorilu
        113
    iorilu  
    OP
       2023-08-29 08:47:50 +08:00
    @sariya 没把 ,我觉得比 bash 标准的那套规范多了

    ps 没有- , -- 两种参数指示的区别, 只有单 -

    而且命令的位置参数, 可选参数很清楚

    另外参数不用写全, 写头几个字母也行

    基本符合现代编程语言参数的调用规范
    mark2025
        114
    mark2025  
       2023-08-29 09:08:31 +08:00
    @eagleoflqj 给你推荐个 google 开发的 npm 包 zx

    我现在项目脚本、运维脚本全是 ts/mts 格式。
    用 zx 这个包来运行系统原生命令很方便(不需要自己再重复地 spawn/fork )比如
    ```ts
    const { stdout } = await $`git pull origin`
    console.log({ stdout })
    ```
    最方便的是以前在 shell 里面处理循环、字符串、数组很麻烦,现在用 js 来弄太方便了。
    **最重要的是脚本有类型保护,开发效率、维护成本(比 py )极大地提高。**

    全局装个 tsx 包 www * npmjs * com / package / tsx
    然后在 ts 脚本第一行添加
    ```ts
    #!/usr/bin/env tsx
    ```
    也可以用 `ts-node` 当执行器,全局安装然后 `Hashbang` 改为
    ```ts
    #!/usr/bin/env ts-node-esm
    ```

    就可以象执行普通 sh 一样执行这个脚本了(并且不需要 tsconfig.json 配置文件)
    mengzhuo
        115
    mengzhuo  
       2023-08-29 10:15:26 +08:00
    说兼容性好的,psh 连 win2019 server 都不支持,我一个写好的 bash 脚本却可以一直用
    市场早就用脚投票了
    stcQ2G13k9yxep40
        116
    stcQ2G13k9yxep40  
       2023-08-29 10:58:36 +08:00 via iPhone
    @NessajCN 这个是 bash 吗?而且上面 powershell 是面向对象的,命令输出的是一个数组,可以很方便的遍历每一个文件,然后做修改文件名,复制,删除等操作。
    stcQ2G13k9yxep40
        117
    stcQ2G13k9yxep40  
       2023-08-29 11:00:41 +08:00 via iPhone
    @mengzhuo 你确定用过 powershell 吗? win server2008 都支持(好像是支持 v3 ),2019 怎么会不支持。
    stcQ2G13k9yxep40
        118
    stcQ2G13k9yxep40  
       2023-08-29 11:04:00 +08:00 via iPhone
    好多人只是简单了解了一下,命令没写过几行,对基本的用法和特性都不了解,就武断的下结论。至少写上一两百个脚本或者几十个小程序以后,再做点评吧。
    stcQ2G13k9yxep40
        119
    stcQ2G13k9yxep40  
       2023-08-29 11:07:35 +08:00 via iPhone
    @e3c78a97e0f8 每天一小时,30 天就可以完全掌握,这还是对于小白。如果有其他脚本或变成经验,两三天就可以完全上手。
    NessajCN
        120
    NessajCN  
       2023-08-29 11:10:38 +08:00
    @qishouvip2022
    敢情你不懂 shell 命令就来说 powershell 比 bash 好用了啊....
    你说的这些都是最基本最基本的操作了
    譬如还是上面的命令,你要删除就加个 -exec rm {}
    find /your/path -type f -name '*test*.doc' -mtime 3 -exec rm {} \;
    改名
    find /your/path -type f -name '*test*.doc' -mtime 3 -exec mv {} new{} \;
    复制
    find /your/path -type f -name '*test*.doc' -mtime 3 -exec cp {} new{} \;

    你自己对比谁方便吧
    GiantHard
        121
    GiantHard  
       2023-08-29 11:58:38 +08:00
    @jrqlxue #83
    > 更不确定常用文本处理: `zgrep |cut|sort|uniq -c|sort -nr|head ` 是否有简单 powershell 的实现了

    这里面很多都是 gnu coreutils 提供的命令


    @NessajCN #120

    find 来自 gnu findutils https://www.gnu.org/software/findutils/manual/html_node/find_html/Invoking-find.html#Invoking-find

    这些跟 shell 没啥关系,不管是 bash, fish 还是 pwsh ,甚至用 js 也都是可以调用的
    GiantHard
        122
    GiantHard  
       2023-08-29 12:01:15 +08:00
    @LitterGopher #94 fish 的适配度也不能跟 bash 相比,fish 无法兼容 bash 语法,真正的一等公民还得是 bash 这类的
    GiantHard
        123
    GiantHard  
       2023-08-29 12:21:12 +08:00
    我觉得 pwsh 很方便的地方在于内置了非常丰富的工具: https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/?view=powershell-7.3

    我之前最常用的是这些:ConvertFrom-Json, ConvertFrom-Csv, ConvertTo-Json, Invoke-WebRequest


    用 bash 或者 fish 的话,不借助第三方工具(/usr/bin/ 下面的软件)根本没法实现
    stcQ2G13k9yxep40
        124
    stcQ2G13k9yxep40  
       2023-08-29 13:17:58 +08:00
    @NessajCN 多说无益,你也是没用过 Powershell ,shell 我用得少。
    stcQ2G13k9yxep40
        125
    stcQ2G13k9yxep40  
       2023-08-29 13:19:06 +08:00
    @NessajCN PowerShell 是一种用于自动化任务和管理系统的强大脚本语言和命令行工具,它在 Windows 环境中得到广泛使用。相比传统的命令行 shell (如 Windows 的 CMD 或类 Unix 系统的 Bash ),PowerShell 在很多方面都具有更强大的功能和优势:

    1. **对象导向:** PowerShell 强调对象导向的编程范式,它将输出数据封装为对象,而不是简单的文本流。这使得数据处理更为直观和灵活,你可以像操作对象一样处理文件、注册表、服务等系统资源。

    2. **强大的管道:** PowerShell 的管道功能允许你将命令的输出直接传递给下一个命令作为输入,实现复杂的数据处理流程。这种管道不仅可以处理文本,还可以处理对象,从而使操作更加富有表现力。

    3. **可扩展性:** PowerShell 支持使用 .NET Framework 的类库,以及其他的扩展模块和插件,这使得你可以轻松地利用现有的功能和创建自己的模块。

    4. **多种数据格式:** PowerShell 支持多种数据格式,包括文本、XML 、JSON 和 CSV 。这使得数据交换和处理更为方便。

    5. **远程管理:** PowerShell 具有强大的远程管理能力,你可以在本地系统上执行命令,也可以在远程计算机上执行,从而实现集中管理。

    6. **强大的命令集:** PowerShell 内置了大量的命令(称为 cmdlet ),用于执行各种操作,从文件操作到系统管理,几乎涵盖了操作系统的方方面面。

    7. **脚本编写:** PowerShell 是一种完整的脚本语言,允许你编写复杂的脚本来处理任务、自动化流程等。

    8. **集成环境:** PowerShell 提供了交互式的命令行界面以及脚本编辑环境,支持智能补全、命令历史等功能。

    9. **安全性:** PowerShell 具有严格的执行策略,可以限制脚本的执行权限,从而提高系统的安全性。

    10. **跨平台支持:** PowerShell 6 及更高版本已经推出了跨平台版本,称为 PowerShell Core ,可以在 Windows 、Linux 和 macOS 上运行。

    总的来说,PowerShell 在系统管理、自动化任务、数据处理等方面具有很大的优势,特别适用于 Windows 环境中的管理和操作。---------from chatgpt
    NessajCN
        126
    NessajCN  
       2023-08-29 13:33:59 +08:00
    @GiantHard 所以我回复的那位用 Get-ChildItem -Path 来举例 powershell 多好用还搬出 chatgpt 来 blabla 说一大通,我用个 find 来说明有全 shell 通用的更方便工具,哪里不对吗
    iorilu
        127
    iorilu  
    OP
       2023-08-29 14:51:08 +08:00
    我发这个贴的目的也不是说 pwsh 现在就比 bash 好

    我是为了让大家了解下

    至少我以前是不了解 pwsh 有这些功能的

    所以作为一个有竞争力的技术, 我认为还是可以了解下, 再根据自己需求决定

    反正学下没坏处
    CodeCodeStudy
        128
    CodeCodeStudy  
       2023-08-29 15:19:09 +08:00
    命令太长了,这就是 PowerShell 普及的最大障碍
    iorilu
        129
    iorilu  
    OP
       2023-08-29 15:38:29 +08:00
    @CodeCodeStudy 这个到没啥, 都有 alias 的, 也可以自定义

    微软的意思是,初学时尽量使用全名, 熟悉了就随便你了

    但就像代码一样, 现在都讲究易读第一, 不是什么谁代码写的短就牛
    NickHopps
        130
    NickHopps  
       2023-08-29 21:27:26 +08:00
    每次看到 psl 就总觉得是 ps1 就觉得这个后缀很怪哈哈
    vvhy
        131
    vvhy  
       2023-08-30 01:33:12 +08:00
    我也在用哈哈,感觉在 windows 上挺有用,写些小脚本什么的,github 上的好多项目也都会提供 powershell 的安装程序
    mark2025
        132
    mark2025  
       2023-08-30 15:51:49 +08:00
    @iorilu pwsh (相比 bash )是非常强大。不过我认为正是这个强大反而是阻碍了其接受度: 命令行简单的输入输出程序裸机搞成交互式程序,明显提升调用、维护、调试的复杂度。

    况且服务器 Linux 系统居多,装 pwsh 我不如装 nodejs 了,用 nodejs 来执行系统 bash 命令实现复杂的功能恐怕能力会比 pwsh 更加强大。
    pwsh 高不成低不就的。
    equationzhao
        133
    equationzhao  
       2023-08-30 20:42:49 +08:00
    @LitterGopher
    New-Alias 的别名是 nal
    `New-Alias -Name gh -Value Get-Help ` -> `nal gh Get-Help`
    mengzhuo
        134
    mengzhuo  
       2023-08-30 21:34:15 +08:00
    @qishouvip2022 用过啊,我就在用 win2019 server ,新版的 psh 很多跑不了,装软件还要重启升级,我可不想为了一个 shell 升级服务器。
    zxbiao
        135
    zxbiao  
       2023-08-31 00:48:53 +08:00
    powershell 在 Windows 下默认禁止未经数字签名的 PS1 直接运行,因为实在太强大了,连巨硬都只能默认禁止未签名的脚本运行。
    如果是有能签名代理证书,那个就实用性比较高。
    可惜,除了大公司外,一般的个人可没有代码签名证书。
    普通用途的 Windows 下,还是 CMD 配合其他批处理程序或脚本语言比较适合。

    或许你会杠说允许未签名的 PS1 脚本允许就行。
    大哥,毕竟用户可是傻瓜,怎么会搞这个。
    就算会搞这个,一旦由于这个功能被黑了,找谁背锅。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1219 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 17:57 · PVG 01:57 · LAX 09:57 · JFK 12:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.