【发布时间】:2021-04-11 06:43:53
【问题描述】:
我想在 powershell 脚本中使用 rimraf 命令来删除某个目录(名为“Results”)中的所有文件和子文件夹。我正在虚拟驱动器(“B”)上测试 rimraf 并且需要使用网络路径,所以我的命令看起来像 rimraf '\\PC name\B\Results\*' ,但它什么也没做,我无法弄清楚正确的语法。我尝试了许多不同的路径变体,但都没有奏效。
【问题讨论】:
标签: powershell glob
我想在 powershell 脚本中使用 rimraf 命令来删除某个目录(名为“Results”)中的所有文件和子文件夹。我正在虚拟驱动器(“B”)上测试 rimraf 并且需要使用网络路径,所以我的命令看起来像 rimraf '\\PC name\B\Results\*' ,但它什么也没做,我无法弄清楚正确的语法。我尝试了许多不同的路径变体,但都没有奏效。
【问题讨论】:
标签: powershell glob
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。
【讨论】: