powershell 如何递归删除包含其他进程使用的文件的整个目录?

f0ofjuux  于 2023-05-22  发布在  Shell
关注(0)|答案(1)|浏览(208)

我已经尝试过类似的东西:

While (Test-Path -Path $destinationApplicationFolder){
    Try{
        Remove-Item -Recurse -Force $destinationApplicationFolder -ErrorAction Stop
    }catch{
        IF((Test-Path -Path $destinationApplicationFolder) -eq $false) {
            Write-Warning "File or directory does not exist."       
        }
        Else {
            #Get-Process | foreach{$processVar = $_;$_.Modules | foreach{if($_.FileName -eq "$destinationApplicationFolder\CC.Core.POCO.dll"){$processVar.Name + " PID:" + $processVar.id}}}
            #Stop-Process $processVar -Force
            Get-Process | ?{$destinationApplicationFolder.path -and (test-path (split-path $destinationApplicationFolder.path -leaf ))} | Stop-Process -whatif
        }
    }
}

是否可以在不安装其他软件的情况下执行此操作?

6yjfywim

6yjfywim1#

明确地陈述可能显而易见的事情:

  • 使用Stop-Process强制终止其他进程通常应该是最后的手段,
  • 特别是使用-Force交换机,因为这也会终止 * 其他 * 用户的进程(如果其他用户登录到同一台机器,可能是远程登录),而不会发出警告-前提是您在 * 提升的 * 会话中运行(以管理员身份运行),因为只有这样您才有必要的权限。

如果您愿意承担此风险,并且假设阻止目录子树被删除的唯一进程是从位于目标子树*内的可执行文件或DLL * 运行的进程,您可以尝试:

while (Test-Path $destinationApplicationFolder) {

  try {
    Remove-Item -Recurse -Force $destinationApplicationFolder -ErrorAction Stop
  }
  catch {
    Get-Process | 
      Where-Object { $_.Modules.FileName -like "$destinationApplicationFolder\*" } |
        Stop-Process -ErrorAction Stop -WhatIf
  }

}

注意:上面命令中的-WhatIf公共参数 * 预览 * 操作。一旦您确定操作将执行您想要的操作,请删除-WhatIf

备注
*如果位于其他位置的可执行文件在目标目录子树中有文件和目录的打开句柄,则可能还有来自这些可执行文件的进程仍然阻止删除。

  • 要识别这些,您有两个选项:
  • 使用openfiles.exe /Query
  • openfiles.exe随Windows一起提供,但**需要一次性运行openfiles /Local ON * 并进行elevation*,然后需要重新启动。
  • 样品调用:
openfiles /query /FO csv | findstr.exe /L /c:$(Convert-Path someFile.txt)
  • 使用按需下载handle.exe SysInternals实用程序,下载后无需预先设置(每次添加-nobanner隐藏版权信息;添加-accepteula(在给定机器上至少一次)以接受许可证)。
  • 样品调用:
handle (Convert-Path someFile.docx)

*Remove-Item -Recurse在Windows 10 20 H2之前的版本中 * 通常 * 会失败,即使 * 没有 * 进程阻止目录的删除(并且如果没有权限问题):令人难以置信的是,文件/文件夹删除WinAPI函数本质上是 * 异步 * 的,这可能会导致 * 间歇性,不可预测的 * 故障-请参阅this answer

相关问题