Remove-Item在文件删除前就返回了?

3
在PowerShell中,我认为我观察到PowerShell尝试在其内容被删除之前删除文件夹。 我正在使用的命令是Remove-Item
过去,使用-recurse会间歇性地出错并抱怨目录不为空。 当我看到那个错误时,我发现目标目录为空。 我最好的猜测是它在文件仍在被删除的过程中继续进行。 现在我看到了更多的证据。
因此,基于上述原因,我尝试使用以下摘录:
$toDelete = Get-ChildItem $path -Recurse
[Array]::Reverse($toDelete)
$toDelete | Remove-Item
Remove-Item $path

我现在得到的提示信息如下:
Confirm
The item at [path to directory] has children and the Recurse parameter was not specified. If you continue, all
children will be removed with the item. Are you sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

当我去检查时,目录再次为空。我最好的猜测是$toDelete | Remove-Item在文件实际被删除之前返回,我看到了这个提示Remove-Item $path

这是一个已知的问题吗?我的猜测是否错误?我该如何解决它?

我尝试使用cmd /C "rd /S [目录路径]",但这会有问题,因为我发现当无法删除某些正在使用中的子项时,退出代码为0。(这可能是我的用法中的潜在情况,而我需要它成为一个错误情况。)

1个回答

3

使用带有-Recurse开关的Remove-Item命令在V1-V3版本中存在漏洞(实际上在帮助文档中提示它无法正常工作)。 在V4中,它终于被修复了。我已经使用这种方法作为解决方法,并且总是有效的:

$toDelete = Get-ChildItem $path -Recurse |
 select -ExpandProperty fullname |
 sort -Property Length -Descending |
 Remove-Item
Remove-Item $path

是的,我在帮助文档中看到过这个。然而,帮助文档明确指出它与“-Include”和“-Recurse”之间的交互有关,而我没有使用它们。很有趣。你用一个变量来捕获输出。想想看,我认为我曾经捕获过其他东西,以防止命令完成前脚本继续执行。我会尝试一下并报告结果。 - jpmc26
1
我认为这在V4中并没有真正得到解决。我仍然看到问题存在。 - jpmc26

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接