我已经尝试过类似的东西:
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
}
}
}
是否可以在不安装其他软件的情况下执行此操作?
1条答案
按热度按时间6yjfywim1#
明确地陈述可能显而易见的事情:
Stop-Process
强制终止其他进程通常应该是最后的手段,-Force
交换机,因为这也会终止 * 其他 * 用户的进程(如果其他用户登录到同一台机器,可能是远程登录),而不会发出警告-前提是您在 * 提升的 * 会话中运行(以管理员身份运行),因为只有这样您才有必要的权限。如果您愿意承担此风险,并且假设阻止目录子树被删除的唯一进程是从位于目标子树*内的可执行文件或DLL * 运行的进程,您可以尝试:
注意:上面命令中的
-WhatIf
公共参数 * 预览 * 操作。一旦您确定操作将执行您想要的操作,请删除-WhatIf
。备注:
*如果位于其他位置的可执行文件在目标目录子树中有文件和目录的打开句柄,则可能还有来自这些可执行文件的进程仍然阻止删除。
openfiles.exe /Query
openfiles.exe
随Windows一起提供,但**需要一次性运行openfiles /Local ON
* 并进行elevation*,然后需要重新启动。handle.exe
SysInternals实用程序,下载后无需预先设置(每次添加-nobanner
隐藏版权信息;添加-accepteula
(在给定机器上至少一次)以接受许可证)。*
Remove-Item -Recurse
在Windows 10 20 H2之前的版本中 * 通常 * 会失败,即使 * 没有 * 进程阻止目录的删除(并且如果没有权限问题):令人难以置信的是,文件/文件夹删除WinAPI函数本质上是 * 异步 * 的,这可能会导致 * 间歇性,不可预测的 * 故障-请参阅this answer。