Rimraf - powershell 脚本 glob 语法

问题描述

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

解决方法

rimraf Node.js 模块和 CLI 通常确实在 Windows 上执行它自己的 globbing,因此 - 给定参数 '\\PC name\B\Results\*',作为逐字字符串,被传递 unmodified 为 rimraf,这意味着 rimraf 不知何故不支持您的 .vhd 驱动器上的 globbing。

注意:-G 命令行选项禁用 globbing,但默认情况下启用。

解决方法是让 PowerShell 进行全局匹配

以下应该有效,但在 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 版本上删除目录子树可能会间歇性失败,这是由于之前文件删除的异步行为 - 请参阅{{3} }.