V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fengsien1999
V2EX  ›  PowerShell

现在 PowerShell 是不是没有什么用?

  •  
  •   fengsien1999 · 122 天前 · 7247 次点击
    这是一个创建于 122 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是不是掌握 Linux 的 Shell 就可以了?

    76 条回复    2022-03-07 17:10:45 +08:00
    ila
        1
    ila  
       122 天前 via Android
    powershell for linux
    cmdOptionKana
        2
    cmdOptionKana  
       122 天前   ❤️ 1
    shell 的基本操作一共没几个,没什么好学的,大概了解一下就行。如果是指 shell 编程,多数情况可以用 python 来代替。
    ch2
        3
    ch2  
       122 天前
    复杂的 shell 写起来不如 python
    MacDows
        4
    MacDows  
       122 天前 via Android
    如果不用 linux 的话,很好用
    nightwitch
        5
    nightwitch  
       122 天前
    写脚本不如 Python
    单纯当个 Shell 的话在 Windows 上还行,但也就是还行的程度,主要的问题是响应太慢
    Tumblr
        6
    Tumblr  
       122 天前
    Windows 运维: 啊?
    Active Directory: 啊?
    Exchange: 啊?
    Azure: 啊?
    在服务器市场中,Windows 服务器占大半,怎么得出来 PowerShell 无用的结论???
    yayiji
        7
    yayiji  
       122 天前 via Android   ❤️ 4
    PowerShell 是很难写的语言,编程语言表达应该极尽精简,而不是趋向自然语言,像 Apple script 一样,你若不是照着抄,根本记不住在怎么写
    kokutou
        8
    kokutou  
       122 天前
    搞 Windows 有用, 不搞基本没啥用
    Tumblr
        9
    Tumblr  
       122 天前
    @yayiji #7 好像“PowerShell 是很难写的语言”的依据是什么呢?😅只是层主个人感觉,还是有调研数据支撑呢?
    不管 reddit 上还是 quora 上,更多的是 it's very easy 。
    另外,你需要明确的是,PowerShell 只是个脚本语言,而不是编程语言(狭义上的),所以一般都是说 scripting 而不是 programming 。PowerShell 也没指望让大家记得每个 cmdlet 的字母和每个 parameter 的拼写,所以有非常强大的自动补全功能。

    说到 PowerShell 了,前段时间我们有个年薪 40~50 万的运维岗,主要就是 PowerShell 挡路了,国内 PowerShell 比较好、英语又比较好的运维好难找啊,招了半年没招到。
    plko345
        10
    plko345  
       122 天前 via Android   ❤️ 1
    @Tumblr 那可以把优秀的招进来学,开发不也类似吗,有的不会 go ,java ,但人优秀,都可以再学
    Tumblr
        11
    Tumblr  
       122 天前
    @plko345 #10 人家一看要求,简历都不投了,哪里去招啊?😅
    不过,死在英语上的更多,是一个 global team ,平时开会什么的,英语是刚需。
    pigspy
        12
    pigspy  
       122 天前
    我觉得 powershell 挺好用的,用 vscode 方便调试,而且类型严格
    MonoLogueChi
        13
    MonoLogueChi  
       122 天前 via Android
    不做 Windows 运维,powershell 当然是没什么用了。Windows 运维的话,powershell 肯定躲不过去,即使是用 Python ,也躲不过 Python 中执行 powershell 命令
    hez2010
        14
    hez2010  
       122 天前
    开源项目里面非常多的构建脚本都是 powershell 写的,因为可以跨平台跑并且自带的库非常齐全。如果用 python 写的话经常会遇到要额外用 pip 装包的情况。
    lovegoogle
        15
    lovegoogle  
       122 天前   ❤️ 1
    Python 跨平台,运维最爱的程序之一,如果公司的生态本身不支持 Python ,再好用也等于无用。。
    2NUT
        16
    2NUT  
       122 天前   ❤️ 2
    powershell 在微软的定位是 替代 cmd, 对标 linux 上的 sh
    地位老高了, 所有操作都有 api

    比如你用 scoop 的话, 它就是 powershell 写的
    BrettD
        17
    BrettD  
       122 天前 via iPhone
    公司业务在 Windows 技术栈上面的话,PowerShell 是非常重要的,CI/CD 或者各种自动化脚本都要用到
    mogging
        18
    mogging  
       122 天前
    域控相关的自动化,IIS 相关的一键搭建环境和部署
    Cooky
        19
    Cooky  
       122 天前
    MS 产品专用,其他地方用实在是没什么意义
    forgottencoast
        20
    forgottencoast  
       122 天前
    @2NUT 关键是所有的操作都有 api 这个,没有它干不了的。
    UnknownR
        21
    UnknownR  
       122 天前
    @Tumblr
    巧了么不是,请问有兴趣聊一下嘛,tg 是 Q29ybko= (base64)
    zhuangzhuang1988
        22
    zhuangzhuang1988  
       122 天前
    可以调试+自动补全 就比被的 shell 好很多了
    ysc3839
        23
    ysc3839  
       122 天前 via Android
    个人认为用作交互式 shell 不好用,但是写脚本还是有用的
    twl007
        24
    twl007  
       122 天前 via iPhone
    如果你要是打算去 MS 工作 还是有用的 如果平时还是 Linuz 多 那可能真没啥用😑
    jdjingdian
        25
    jdjingdian  
       122 天前
    powershell 我觉得不好用,但是有些时候是有用的
    比如我要给 ESXi 的安装镜像封装一些官方没有的驱动,就可以用 powershell 的脚本来给镜像打驱动
    VanceKing
        26
    VanceKing  
       122 天前 via Android
    在 Windows 上用命令行还是很方便
    fengsien1999
        27
    fengsien1999  
    OP
       122 天前
    是不是国内除了微软自己,Windows 服务器的岗很少?你司的岗是在哪里发布的 工作地点在哪里?
    fengsien1999
        28
    fengsien1999  
    OP
       122 天前
    @VanceKing 在 windows 上一般用 cmd 。去年 11 月看一本书《笨办法学 Python3 》,书中用 PowerShell 作为 CLI ,但是也就用到讲 PowerShell 的一本书中的百分之二、三。其余时间没用过 PowerShell
    wittyfans
        29
    wittyfans  
       122 天前 via iPhone
    以前做运维的时候,用 powershell + pdq 自动部署软件,自动卸载重装用户软件或者改配置什么的太香了。
    kenvix
        30
    kenvix  
       122 天前 via Android
    你知道许多 windows api 只提供 powershell 接口吗
    germain
        31
    germain  
       122 天前 via iPhone
    搞得好像只有在 Microsoft 工作才用 PowerShell 一样😂
    darklights
        32
    darklights  
       122 天前
    如果是面向工资编程,完全没必要主动去学。
    如果是需求导向,可以花少许时间学一学语法和常用命令,做一些任务比通用脚本方便。
    个人评价的话,至少对我这种不用 Linux 也不经常玩小黑窗的,PowerShel 比隔壁的鬼画符易学易写,会一些基础后,基本上可以靠文档和智能提示,边摸索边解决问题。当然,比自家的 bat 好一百倍。
    Osk
        33
    Osk  
       122 天前
    powershell 背靠 .net, 强大, 补全强大, 但是那语法真的是... 奇怪.

    Windows 上 powershell 是真的强, 系统管理等用途简直是神器.

    我自己用 powershell 偶尔写一些小工具, 比如一键设置针对某个程序的防火墙规则什么的.
    有段时间我要用 hyper-v 来测试虚拟机, 用 powershell 做了个脚本一键克隆虚拟机模板 (一个准备好的 vhdx + json 记录模板信息), 用起来很方便了.


    不过就算如此, 我还是想说 powershell 语言语法本身没有啥非用不可的特性, 我用它的原因很大一部分是它背靠 .net, 一堆 api 和 cmdlet 可以直接调用, 如果没有这些, 谁用它...
    也就是说某种意义上的生态良好.


    另外, 想对 powershell 和 .net 的差评就是, 不能 portable:
    写个 .net 工具, 结果 Win 7 带 .net 3.5, Win 8+ 带 4.0+, 就很迷茫. 对于运维中来说, 很糟糕, 你不想现场给破电脑部署 .net 3 或者 .net 4.

    powershell 也是, 写个小脚本, 好强大呀, 几行就搞定了, 结果 Win 7 一跑, 哦豁, ps 版本过低, 这个 cmdlet 没有, 那个也没有. 用 Win 7 的 ps 版本做基础开发? 算了, 还是 cmd 或者 python 吧.

    有时候真的不介意最终 exe/dll 文件很大带上运行时库, 但很介意需要运行时装这装那.
    lonewolfakela
        34
    lonewolfakela  
       122 天前
    @Osk “有时候真的不介意最终 exe/dll 文件很大带上运行时库, 但很介意需要运行时装这装那.”
    呃,所以 .Net 6 和 PowerShell 7 欢迎您?
    dcsuibian
        35
    dcsuibian  
       122 天前
    值得学,毕竟 windows 还有 74%的市场占有率呢
    snw
        36
    snw  
       122 天前 via Android
    不只是运维,我个人电脑也会用到 powershell ,因为 Win10 的设置太残废了,曾经强大的控制面板也被祸祸到半残。

    不过我也遇到过设置面板里有的功能却找不到 powershell 对应命令,虽然理论上肯定是有的。
    BrettD
        37
    BrettD  
       122 天前 via iPhone
    @fengsien1999 银行行业里 Windows 技术栈的使用还是不少的,其他传统行业或者 2B 业务估计也是
    20150517
        38
    20150517  
       122 天前 via iPad
    这恶心的语法看了就不想用
    g00001
        39
    g00001  
       122 天前
    有些简单的事搞太复杂了也不一定好,
    就像 GIF 截个屏吧,.Net 写的 ScreenToGif 一个 EXE 文件 158 MB ,复制个 GIF 都不行。

    而 aardio 写的 Gif123 就几百 KB ,
    一键复制 GIF ,可以粘贴到其他程序里不会变空白,变静态图像、无效图像。

    如果不习惯 PowerShell ,
    可以试试 aardio 里调用 PowerShell 会比较轻便。

    一、aardio 导入 PowerShell Cmdlet 直接使用(内存嵌入、免安装):

    import dotNet;
    Cmdlets = dotNet.loadFile($"\PowerShell\AudioDeviceCmdlets.dll");
    CoreAudioApi = Cmdlets.import("CoreAudioApi");
    var mmDeviceEnumerator = CoreAudioApi.MMDeviceEnumerator()

    二、aardio 执行 PowerShell 命令

    import dotNet.ps;
    var result = dotNet.ps.command("Get-Command",{Name="*Process"});

    三、aardio 通过管道调用 PowerShell

    import process.popen;
    var prcs = process.popen.ps(`-Command "& {Get-Command -Name *Process}"`);
    var result = prcs.read(-1);
    imycc
        40
    imycc  
       122 天前   ❤️ 1
    搞 windows 服务器维护,或者在自己电脑上折腾些小玩意的时候很有用。做一些系统配置,可以直接用 powershell 一两条命令搞定,微软官网的文档也算全面,能很方便搜到。如果用 python 做,不一定有库支持,或者实现方式比较怪。

    powershell 能调用.net 类库,能写非常复杂的功能,不过我断断续续用了一两年,也没用多深入。当面对复杂需求的时候,更倾向于将具体跟系统交互的部分写成 ps1 脚本,然后用 python 调用它。
    在学习新技能方面我觉得“够用就好”,根据工作需要来。我们都是一块砖,那里需要往哪搬
    yanmu6626
        41
    yanmu6626  
       122 天前
    说实话,对于纯搞开发来说,真没觉得有啥好用的,用它我用 py 不行吗,还有人说 ps 比 py 好用,看见语法,我个人表示 py 真的比 ps 好理解一些
    Xhack
        42
    Xhack  
       122 天前
    @Tumblr 真的是 windows 占大半吗?
    dbpe
        43
    dbpe  
       122 天前
    windows 服务器真的有那么大占比么?
    orannge
        44
    orannge  
       122 天前
    之前有过相关讨论 /t/748686
    ejdjxidbsn
        45
    ejdjxidbsn  
       122 天前
    azure 人人都要写 powershell (悲)
    zhangjinghua
        46
    zhangjinghua  
       122 天前
    我一个删除文件夹都没搞明白,powershell 和批处理是不是不一个玩意啊。。。。。。。
    duke807
        47
    duke807  
       122 天前 via Android
    如果選擇了 windows ,沒用也要学,windows 下沒用的玩意還少嗎,vbs 、bat 、mfc 、win32 、visual basic 、asp … 還有當年學校教編程只教了沒用的 foxpro ,我是 07 界的應用電子技術的學生(應該教 c 才對,但是沒教,垃圾學校)

    反觀 linux ,幾十年前學的 shell script ,到現在依然是主流,學的東西都基本不會過時
    Osk
        48
    Osk  
       122 天前
    @zhangjinghua 可以说完全不一样, powershell 里面一些看起来像 cmd / linux shell 里面一些工具的东西, 比如 ls rd md 什么的, 他都是 powershell 原生命令的 alias, 继续用 alias 会容易混淆, 用相应的原生命令替换了吧.

    删除命令是 remove-item, 可能他有一个 alias 叫 rd , 但他和 cmd 的 rd 完全是两个东西.
    aloxaf
        49
    aloxaf  
       122 天前
    @yayiji

    > 编程语言表达应该极尽精简
    你是认真的吗……
    建议去 codegolf.stackexchange.com 上看看,上面有很多人会教你如何用「极尽精简」的语言来解决问题,比如用 J 语言求 0~1000 内 3 和 5 的倍数之和:+/(#~[:+./0=3 5|/])i.1000
    w4087
        50
    w4087  
       121 天前
    powershell 为啥敢叫这个名字不是没道理的
    wjswxp
        51
    wjswxp  
       121 天前
    > 个人认为用作交互式 shell 不好用,但是写脚本还是有用的

    同感。pwsh 相比 bash 有参数的类型系统,不必借助 sed awk 能够处理字符串,写起来也感觉更可靠。

    但语法不统一的问题,使学习过程很令人迷惑。

    举几个例子:

    ```ps1
    # 借助 C# String 类型的方法
    if ([string]::IsNullOrEmpty($s)) {
    $s = "default-value"
    }

    # 使用 PowerShell 内置操作符的写法不同 -match
    if ($s -match $regex_pattern) {
    # use $Matches
    }

    # 没有比较直觉的 "==" 而是 "-eq"(一致却不常规
    if ($s -eq "sth") {
    # ...
    }

    # 调用 PowerShell Cmdlet 的传参写法又有不同
    # 为了使用内一表达式其结果(这里取反),要用 () 或 $() 包起来
    if (-not (Test-Path -Path "path/to/not-exist")) {
    # ...
    }

    # 如果想在传参时写表达式,同上,要用 () $() 包起来
    $a = Join-Path -Path (Resolve-Path -Path ".") "filename"
    ```

    ```ps1
    # 这里的 Add() 不 Out-Null 会 Out-Default ,如果在脚本的最外层那就是向 stdout 输出
    $dict = [System.Collections.Generic.Dictionary[string, string]]::new()
    $dict.Add("key", "value") | Out-Null

    # pwsh 函数的返回值就是函数内的输出,参见文档 "about_Return"
    function foo() {
    # 赋值语句不会 Out-Default
    $s = "Hello"
    # 结尾没有 ";" 的表达式会 Out-Default
    $s
    # return 仅表示跳出
    return
    }
    $a = foo() # "Hello"

    # 但是在 PowerShell 5 起引入了 class 支持,在 class 里 return 符合常规编程语言的直觉
    # 看文档吧 "about_Classes"
    ```
    wjswxp
        52
    wjswxp  
       121 天前
    又想到一个例子 2333

    ```ps1
    $files = Get-Item -Path "."
    # foreach..in 和 ForEach-Object 的语法(和效率)是两回事,参见 "about_Foreach"
    foreach ($file in $files) {
    # 这里是和其他字符串替换略有不同的地方,pwsh 不提供单独的 ${file.Name} 写法
    Write-Host "name=$($file.Name)"
    }
    ```
    Tumblr
        53
    Tumblr  
       121 天前
    @Xhack #42 @dbpe #43 看到过一个数据,2018 年六月底到 2019 年六月底,Windows Server 从 71.9%上升到 72.8%,Linux 从 12.9%上升到 13.2%。https://www.statista.com/statistics/915085/global-server-share-by-os/

    也有人给过我一个数据( https://w3techs.com/technologies/overview/operating_system ),说 Linux 占 8 成,不过这有个误区,并不是所有的 server 都是 web server ,这个链接只针对 website server ,所以我更倾向于上面那个数据。
    Tumblr
        54
    Tumblr  
       121 天前
    @Osk #48 Remove-Item 的 alias 其实有好几个了:
    del -> Remove-Item
    erase -> Remove-Item
    rd -> Remove-Item
    ri -> Remove-Item
    rm -> Remove-Item
    rmdir -> Remove-Item
    其实也是个使用习惯,Linux 下遇到不会的知道 -h 一下,PowerShell 里不会的就是不会了,很少有人去 help 一下 。
    sunhelter
        55
    sunhelter  
       121 天前
    @fengsien1999 你也太局限了,实体行业基本很多都是 windows server ,运维门槛低。
    jim9606
        56
    jim9606  
       121 天前
    因为你不搞 Windows 运维。
    相当多的 Windows 管理命令是只能用 Powershell 执行的,例如 MSIX 软件包(商店应用)管理的几个命令。觉得用不上是因为复杂的操作都跑去 GUI 了,Linux 一般没这个路线。
    darklights
        57
    darklights  
       121 天前
    @wjswxp
    ls 是命令,(ls) 是表达式
    比较操作符、传参需要的是表达式
    > 用作重定向,lt eq 之类作为比较操作符是 shell script 语法老传统了,不是 PS 独创

    function 本质上是简写的 cmdlet ,当作为传统上的“函数”来用,确实是蛮蛋疼的,尤其是调用.Net 方法有返回值时,冷不丁就变成返回数组。踩过的坑之一。
    ciaoly
        58
    ciaoly  
       121 天前 via Android
    PowerShell 真的很好用啊🥲
    SenLief
        59
    SenLief  
       121 天前
    windows 服务器运维还是在用的。
    fengsien1999
        60
    fengsien1999  
    OP
       121 天前
    @SenLief windows 服务器运维的岗位在国内是不是很少?
    fengsien1999
        61
    fengsien1999  
    OP
       121 天前
    @jim9606 服务器运维的岗位在国内是不是很少?
    imn1
        62
    imn1  
       121 天前
    linux shell 背后有很多命令行工具依靠组成的
    powershell 背后是.net

    例如,linux 命令行下载,更多是依靠 wget 之类,powershell 则是依靠.net 的网络组件
    还有一些文件内容相关的,例如编码、crc32 、文件比较,只有 shell 没有相关工具也是很难

    引申就是学习成本,单纯 shell 学得很快,然后做事查各个工具的手册,powershell 学得慢,因为还要学.net 的基础知识
    james122333
        63
    james122333  
       121 天前 via Android
    就算这工具有 linux 版也不会去使用 真的不如直接写其它语言 而且 shell 已经够 power
    我都有一个自己的库 也实现了命名空间
    对象功能正在研究
    janxin
        64
    janxin  
       121 天前 via iPhone
    windows 运维缓缓打出个?
    playboy0
        65
    playboy0  
       121 天前
    想学 powershell 只能看官方文档吗,感觉视频资料很少啊
    tankren
        66
    tankren  
       121 天前
    公司里面挺好用的 增强生产力
    fengsien1999
        67
    fengsien1999  
    OP
       121 天前
    @playboy0 有书
    CallMeReznov
        68
    CallMeReznov  
       121 天前
    powershell 是微软这些年开始干正事的第一个作品.
    alsas
        69
    alsas  
       121 天前
    复杂的 shell 直接用 python 代替
    FrankHB
        70
    FrankHB  
       121 天前   ❤️ 1
    这不是现在的问题,以前的分析 https://www.v2ex.com/t/743334#r_10060656 仍然适用。

    长话短说:只会习惯 Windows 体系的运维或许有用。

    别的地方用没用另说,但有时候显然不如不用。
    就不适合开发人员写脚本,再补个以前遇到的案例: https://github.com/flutter/flutter/issues/12666#issuecomment-636497901
    很显然 PowerShell 脚本的作者没考虑到一些日常应该考虑到的简单情况,结果让行为变得极其愚蠢。
    这不是说 bug 就是 PowerShell 特供的,但事实上这个功能在对应的 UNIX shell 脚本里就没问题。这间接体现出保证 PowerShell 脚本质量大约比 UNIX shell 更困难,即便后者坑已经够多了。
    况且要求装个 pwsh 只是勉强算简便,实际装的东西比起 MSYS 之类也并不轻便(还是隐含.NET 依赖的情况),还不提 MSYS 普遍比 pwsh 甚至系统自带的 PowerShell 的可用性都好。(现在 Windows 都自带 curl ,写个一行安装 MSYS2 的也不是不行,PowerShell 这时候比 cmd 方便的地方就更像当年 Edge“用来下载别的浏览器的浏览器”了。) Windows 开发者的确也有不少和 LZ 现在这样想的更熟悉类 UNIX shell 懒得碰 PowerShell 来偷懒的,特别是不愿意依赖.NET 这种精神 COM 包袱的纯粹本机开发者和跨平台开发者。所以说即便照顾 Windows 用户,PowerShell 这个选项也基本是多余的。
    这也再次显示出 PowerShell 提供的不同的 shell 特性并不能有效地防止一些编程错误,需要正经的脚本程序不如用健全一点的常规“脚本语言”。
    fsdrw08
        71
    fsdrw08  
       121 天前 via Android
    @Tumblr 感觉你好像是在找我啊…我敢说自己精通 powershell ,英语没问题,对,我就是外企 HelpDesk
    raptor
        72
    raptor  
       121 天前
    70 楼说得很清楚。

    很多年前就听说 PS 号称很 NB ,比 SHELL 强一百倍啊一百倍,结果前一阵听几个老司机私下吐槽才知道,居然有不少在 SHELL 里很简单常用的功能,居然在 PS 里要写一大堆代码(有些还是微软官方答复)。看来所谓好用不过是操作 windows 特有功能时方便。
    zhangyufei49
        73
    zhangyufei49  
       121 天前
    我近一年一直在做 windows 游戏开发。经常用到 ps 做自动化的一些东西。习惯了就觉得蛮好用的。
    有没有用毕竟是看使用场景的嘛。如果你经常在类 unix 机器上开发,那肯定觉得不如 bash ,zsh 这些好用。
    因为微软官方为 ps 提供跨平台的实现。所以一些跨平台的脚本也可能是使用 ps 的。
    我知道的应用场景里面,亚马逊云的 lambda 就提供了 ps 作为一种内置提供的 runtime ,而不是 bash ,zsh 这些。
    wangtian2020
        74
    wangtian2020  
       121 天前
    至少可以替代 cmd ,vscode 的 powershell 明显比 cmd 好用
    visonnn
        75
    visonnn  
       120 天前
    管理 AD 、Exchange 、Microsoft 365 的大量操作都需要 PowerShell 啦。

    确实像上面有老哥说的,面向工资的话没什么需要学。
    asm
        76
    asm  
       120 天前
    现在好多恶意代码都开始用 powershell 写了,闹呢~~
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3237 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 04:30 · PVG 12:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.