gpt4 book ai didi

PowerShell 删除项目不等待

转载 作者:行者123 更新时间:2023-12-02 18:47:15 25 4
gpt4 key购买 nike

如果有这段代码

if(Test-Path -Path $OUT) 
{
Remove-Item $OUT -Recurse
}
New-Item -ItemType directory -Path $OUT

有时它可以工作,但有时 New-Item 行会产生 PermissionDenied ItemExistsUnauthorizedAccessError 错误。我认为这意味着之前的删除项目尚未完全执行,并且无法创建该文件夹,因为它仍然存在。

如果我在那里插休眠眠

if(Test-Path -Path $OUT) 
{
Remove-Item $OUT -Recurse
Start-Sleep -s 1
}
New-Item -ItemType directory -Path $OUT

然后它就一直有效。如何强制删除项目以确保文件夹确实被删除?或者也许我错过了其他东西?

最佳答案

更新:从(至少 [1])Windows 10 版本 20H2 开始(我不不知道对应的 Windows Server 版本和构建;运行 winver.exe 来检查您的版本和构建)、DeleteFile Windows API 函数现在表现出同步行为,这隐式解决了PowerShell的Remove-Item和.NET的System.IO.File.Delete的问题/System.IO.Directory.Delete(但是,奇怪的是,使用 cmd.exerd/s )。

<小时/>

Remove-Item -Recurse 意外地异步,最终是因为用于文件和目录删除的 Windows API 方法本质上是异步的Remove-Item 不能解释这一点。

这种间歇性地、不可预测表现为以下两种方式之一:

  • 您的情况:删除后立即重新创建已删除的目录可能会失败,因为在尝试重新创建时删除可能尚未完成。

  • 更典型的是:如果在尝试删除父目录时子目录或文件的删除尚未完成,则删除非空目录本身可能会失败 - 这在 ServerFault answer 中进行了演示。 marsze 链接到。

一个潜在的解决方法是通过清空重用现有目录 - 而不是删除并重新创建它.

但是,使用 Get-ChildItem $OUT -Recurse | 清空目录Remove-Item -Recurse容易受到间歇性故障的影响,尽管可能不太常见。

该问题不仅影响 PowerShell 的 Remove-Item,还影响 cmd.exerd/s 以及 .NET 的 [System.IO.Directory]::Delete():

自 Windows PowerShell v5.1/PowerShell Core 6.2.0-preview.1/cmd.exe 10.0.17134.407/.NET Framework 4.7.03056、.NET Core 2.1、 Remove-Itemrd/s[System.IO.Directory]::Delete() 均无法可靠工作 ,因为它们未能考虑 Windows API 文件/目录删除函数的异步行为:

有关提供可靠同步解决方法自定义 PowerShell 函数,请参阅 this answer .

<小时/>

[1] 我亲自通过在 GitHub issue #27958 中运行测试来验证该问题已在版本 20H2 中得到解决。连续数小时无故障; this answer表明该问题早在 1909 版本中就得到了解决,从构建 18363.657 开始,但是 Dinh Tran发现在删除大型目录树(例如 node_modules)时,该问题在构建 18363.1316得到解决。我找不到有关该主题的任何官方信息。

关于PowerShell 删除项目不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53207678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com