【问题标题】:Rimraf - powershell script glob syntaxRimraf - powershell 脚本 glob 语法
【发布时间】:2021-04-11 06:43:53
【问题描述】:

我想在 powershell 脚本中使用 rimraf 命令来删除某个目录(名为“Results”)中的所有文件和子文件夹。我正在虚拟驱动器(“B”)上测试 rimraf 并且需要使用网络路径,所以我的命令看起来像 rimraf '\\PC name\B\Results\*' ,但它什么也没做,我无法弄清楚正确的语法。我尝试了许多不同的路径变体,但都没有奏效。

【问题讨论】:

    标签: powershell glob


    【解决方案1】:

    rimraf Node.js 模块和 CLI 通常确实在 Windows 上执行自己的通配,所以 - 假设 '\\PC name\B\Results\*' 参数作为逐字字符串传递未修改 到rimraf,这意味着rimraf 不支持在您的.vhd 驱动器上进行通配。

    注意:-G 命令行选项禁用通配,但默认启用。

    解决方法是让 PowerShell 进行 globbing

    以下应该可以工作,但从rimraf v3.0.2 / Node.js v14.15.12 起无效:

    # !! Currently does NOT work - even though it should.
    # CAVEAT: INSTANTLY DELETES ALL CONTENT IN THE TARGET DIR.
    rimraf -G (Get-Item '\\PC name\B\Results\*' -Force).FullName
    

    看起来,传递 多个 路径(Get-Item 调用导致文件/目录名称的数组,其元素作为单独的参数传递)当前已损坏。

    因此,使用下面的,但是速度很慢,因为 rimraf 是为每个文件和目录单独调用的:

    # Should work, but is slow.
    # CAVEAT: INSTANTLY DELETES ALL CONTENT IN THE TARGET DIR.
    (Get-Item '\\PC name\B\Results\*' -Force).FullName | % { rimraf -G $_ }
    

    当然,你也可以使用PowerShell自带的Remove-Item cmdlet

    # CAVEAT: If you remove -WhatIf, instantly deletes all content in the target dir.
    Remove-Item '\\PC name\B\Results\*' -Recurse -Force -WhatIf
    

    请注意,无论用于删除的工具如何,在 Windows 10 20H2 之前的 Windows 版本上删除 目录子树 可能会由于之前的文件删除异步行为而间歇性失败 - 请参阅 this answer

    【讨论】:

    • 非常感谢您提供的所有信息和您的解决方案!
    • 我很高兴听到它有帮助,@JakubDlabka;我的荣幸。
    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2022-01-23
    相关资源
    最近更新 更多