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

Windows 脚本/批处理比我想象得有用的多

  •  
  •   ungrown · 2020-04-10 03:59:52 +08:00 · 3568 次点击
    这是一个创建于 1449 天前的主题,其中的信息可能已经有所发展或是发生改变。
    26 条回复    2020-04-18 13:01:44 +08:00
    kokutou
        1
    kokutou  
       2020-04-10 07:05:04 +08:00 via Android
    DOS 本来就是用作针对文件的操作系统嘛。。。Windows 的 cmd 发扬光大了,扩充了不少功能。。。
    现在建议转 PowerShell 。。。也挺强
    cmdOptionKana
        2
    cmdOptionKana  
       2020-04-10 07:28:18 +08:00   ❤️ 2
    现在 powershell 可能是最强的 shell 了,好用到炸裂,而且跨平台,Linux 下也能用。
    Davic1
        3
    Davic1  
       2020-04-10 08:19:37 +08:00
    @cmdOptionKana 喔? 有没有 powershell 功能特性介绍的页面推荐一下? 想具体了解一下优势在啥地方~
    Mithril
        4
    Mithril  
       2020-04-10 08:47:46 +08:00
    @Davic1 虽然第一眼看上去写法比较奇葩罗嗦,不过因为所有命令设计的都很统一,用起来还是比较舒服的。
    PowerShell 本身也是面向对象的,你可以在脚本里面直接操作传递对象,列出对象的所有属性,而不用每次都去搞字符串。
    最舒服的是可以直接在 PowerShell 里面调用你.NET 写的库,和.NET 本身的各种 API 。
    Davic1
        5
    Davic1  
       2020-04-10 08:54:44 +08:00
    @Mithril 哈 thx ~
    Osk
        6
    Osk  
       2020-04-10 09:13:10 +08:00
    @Mithril powershell 用起来确实 6, 管道传递对象这个设计感觉很方便...

    最大的痛就是和 .Net 好像有绑定, 比如我在 Windows 10 最新版上写脚本, 有不少可用的新 commandlet, 结果在 Windows 7 上一测试啥都用不了... 然后 powershell 又不能像其它脚本语言那样把运行时 /解释器和脚本打包.
    cmdOptionKana
        7
    cmdOptionKana  
       2020-04-10 09:18:03 +08:00   ❤️ 1
    @Davic1 具体我也不是很懂,最近安装了跨平台的 powershell 7, 发现它很有诚意,ls, ps 等命令都提供了,明显照顾 linux 用户,搜索命令历史的快捷键也改成了 Ctrl+R,日常的简单操作已经与 bash 无异。

    另外,powershell 不仅命令可以自动补全,连参数都可以自动补全。

    在脚本编程方面,由于天生面向对象并且得到微软的支持不断发展迭代,现在已经非常先进,比如连 null 操作符都有了(就是那些问号操作符 ??, ??=, ?. 之类的,方便 null 相关操作)

    具体的最新特性(超强!)请看这里 https://docs.microsoft.com/zh-cn/powershell/scripting/whats-new/what-s-new-in-powershell-70?view=powershell-7

    基本理念说明请看这里 https://docs.microsoft.com/zh-cn/powershell/scripting/overview?view=powershell-7
    cmdOptionKana
        8
    cmdOptionKana  
       2020-04-10 09:19:26 +08:00
    还有,它开源,提供了各大 Linux 发行版的二进制文件,提供中文文档(这点也很赞)。
    Mithril
        9
    Mithril  
       2020-04-10 09:27:07 +08:00   ❤️ 1
    @Osk Windows 7 带的那个是老版本的,大概是 2.0 好像。Windows 10 的好像都是 5 了。你装个新版的 PowerShell 就可以了。
    或者你去试试 PowerShell Core,Github 官方的 Release 页面有 zip 的 Release 。那个解压直接能用。
    Mithril
        10
    Mithril  
       2020-04-10 09:33:09 +08:00
    @cmdOptionKana PowerShell 里面有一堆的 alias,ls,dir 实际上都是 Get-ChildItem 。不过也就只是别名而已,你也不能用原生命令支持的那些参数。
    itfanr
        11
    itfanr  
       2020-04-10 10:27:12 +08:00
    @cmdOptionKana 在 Linux 下用?
    cmdOptionKana
        12
    cmdOptionKana  
       2020-04-10 10:34:17 +08:00 via iPad
    @itfanr 只是说它支持 Linux,转不转看个人意愿,我自己也没转。
    cmdOptionKana
        13
    cmdOptionKana  
       2020-04-10 10:37:05 +08:00 via iPad
    @Mithril 对,不过可以看出微软还是很有诚意的,而且也算是平滑了入门过渡的难度曲线,印象分能加点。
    jin7
        14
    jin7  
       2020-04-10 10:48:06 +08:00
    cmd 比 bash 还难懂...
    Jirajine
        15
    Jirajine  
       2020-04-10 10:55:28 +08:00 via Android
    @cmdOptionKana 照顾 Linux 用户?
    Linux 用户跑一个$cat a.jpg >b.jpg 就被它那坑爹的别名和管道搞懵了。
    Osk
        16
    Osk  
       2020-04-10 10:56:22 +08:00
    @Mithril 感谢, 原来还有这种, 不过试了一下, 我用的比较多的 commandlet 一个都没, 当然, 大部分都是和 Windows 管理本身相关的, 比如 get-Command *Net* ... 升级 Windows 7 的 Powershell 是不可能升级的...
    ClericPy
        17
    ClericPy  
       2020-04-10 11:06:22 +08:00
    autohotkey 够香了...
    whywhywhy
        18
    whywhywhy  
       2020-04-10 11:06:25 +08:00
    powershell 可以写 GUI,所以。。。。
    Mithril
        19
    Mithril  
       2020-04-10 11:52:12 +08:00   ❤️ 1
    @Osk PowerShell Core 默认情况下没有加载很多 Module,有不少 Net 命令都是额外 Module 里的。
    而且还有个专门的 WindowsCompatibility Module,你想要 portable 的话可以试试把它的 dll 弄进去直接 import 。
    当然不可能完全跟老版本的 PowerShell 一样就是了。
    imn1
        20
    imn1  
       2020-04-10 12:15:26 +08:00   ❤️ 1
    @Davic1
    可以调用.net(win)/.net core(跨平台)
    https://docs.microsoft.com/en-us/dotnet/api/index?view=netframework-4.7.2
    https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/?view=powershell-7

    LINQ
    https://www.red-gate.com/simple-talk/dotnet/net-framework/high-performance-powershell-linq/

    GUI(win only)
    https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms?view=netframework-4.7.2
    GUI 不用说了,对于补充命令行的不足,drag&drop 绝对是第一目的

    三方模块
    例如 https://github.com/RamblingCookieMonster/Invoke-Parallel 并发器
    https://github.com/Windos/BurntToast win10 的冒泡提醒
    还能载入 dll 编程,不过.net 的容易些,按照 C#手册就能写,其他的要自己摸索

    其他的一些细节写法的方便,例如
    PS C:\>命令 1..1024
    数组参数,传入一个 1~1024 的 range 数组
    好多 shell 常用命令在 ps 里面内置了 alias,如“cat file.txt”其实是“Get-Content file.txt”的 alias

    bash/shell 还是需要不同的工具、软件共同构成强大,ps 是自己就很强
    但使用时感觉稍微慢点,速度比不上 python 和 bash
    用 ps 写爬虫挺有趣的,从抓取、提取、保存都能在 ps 完成,不过大量运行嘛……呃 🤮
    imn1
        21
    imn1  
       2020-04-10 12:29:56 +08:00
    @Davic1
    补充,ps 在 win 平台,调用.net 或.net dll,运行要比原生写法快很多,例如多文件批量处理 get-item 是比较慢的

    题外
    M$有个 ChnCharInfo.dll ,用它可以反查拼音(汉字➡️拼音)很强,暂时其他非.net 语言还没见到比它更好的例子
    ps/c#例子是有了,我想在 python 调用,但不会写,因为是.net
    ddup
        22
    ddup  
       2020-04-10 12:43:47 +08:00
    PowerShell 强到没对手,而且跨平台,就是 C# 那么优美,PowerShell 咋整得 有点丑呢。
    jin7
        23
    jin7  
       2020-04-11 10:19:08 +08:00
    powershell 最变态的一点就是 “”中文单 /双引号和英文单 /双引号效果一样 太无语了
    还有 有参函数调用的写法 有坑 可能未察觉的写错了
    ps1aniuge
        24
    ps1aniuge  
       2020-04-18 12:31:50 +08:00
    ps 第三课:面向对象语言有啥优缺点?
    http://bbs.chinaunix.net/thread-4264062-1-1.html
    http://tieba.baidu.com/p/5913346984


    ps 第 7 课:powershell 到底有何优势,为什么要学?
    http://bbs.chinaunix.net/thread-4264776-1-1.html


    @Davic1
    ps1aniuge
        25
    ps1aniuge  
       2020-04-18 12:57:19 +08:00
    @jin7 庆五一,分享 powershell 奇技淫巧,部分解决 bash 的癌症。
    shell 支持一对单引号,一对双引号。简称 2 层。多了就必须转义。我们不喜欢转义。
    但 powershell 支持用 [中文单引号] =当 [单引号] 。用 [中文双引号] =当 [双引号] 。
    所以用 bash 调用 powershell 发送命令时,可以使用 4 层单双引号。这使用了 bash 不支持中文单双引号的特性。
    这个特性支持写在 ps 脚本中,也支持在命令行中用 pwsh -c “ps 命令”。

    #问:这个脚本谁写的?有问题找谁技术支持?
    #答:QQ 群号=183173532
    #名称=powershell 交流群
    #华夏脚之峰。Everest of the powershell
    #专门教学 win,linux 通用的 ps1 脚本。不想学也可以,入群用红包求写脚本。

    例子:
    ssh [email protected] "echo 'a'"
    #上面是传统命令,下面是 ps 奇技淫巧
    ssh [email protected] "pwsh -c “echo (‘a’+'b') ” "
    ssh root@跳板机 ip "pwsh -c “ssh root@真机 ip ‘中文单引号包围的命令’ ” "

    那么,是否可以再套 bash,在套 ps 呢?自己研究吧。
    ps1aniuge
        26
    ps1aniuge  
       2020-04-18 13:01:44 +08:00
    论坛把中文引号,,,,强制转换成英文了。唉。看来 py 也是解释 中文单双引号,为英文。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1273 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:29 · PVG 07:29 · LAX 16:29 · JFK 19:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.