Windows 的一个真正令人沮丧的“功能”是进程锁定文件并阻止删除目录。
我正在寻找一种方法来定位所有在该目录中打开文件的进程,类似于 unix 上的“lsof”。我正在寻找一些 powershell 魔法,我宁愿不必购买一些自定义维护工具。
最佳答案
所以我有好消息和坏消息。我将从坏消息开始……我还没有找到在 PowerShell 中严格关闭锁定文件的方法。好消息是,它可以通过 PowerShell 脚本来完成,并从 SysInternals 的一个名为 Handle.exe 的免费实用程序中获得一点帮助。这是我手头的脚本:
Function Close-LockedFile{
Param(
[Parameter(Mandatory=$true,ValueFromPipeline=$true)][String[]]$Filename
)
Begin{
$HandleApp = 'C:\sysinternals\Handle.exe'
If(!(Test-Path $HandleApp)){Write-Host "Handle.exe not found at $HandleApp`nPlease download it from www.sysinternals.com and save it in the afore mentioned location.";break}
}
Process{
$HandleOut = Invoke-Expression ($HandleApp+' '+$Filename)
$Locks = $HandleOut |?{$_ -match "(.+?)\s+pid: (\d+?)\s+type: File\s+(\w+?): (.+)\s*$"}|%{
[PSCustomObject]@{
'AppName' = $Matches[1]
'PID' = $Matches[2]
'FileHandle' = $Matches[3]
'FilePath' = $Matches[4]
}
}
ForEach($Lock in $Locks){
Invoke-Expression ($HandleApp + " -p " + $Lock.PID + " -c " + $Lock.FileHandle + " -y") | Out-Null
If ( ! $LastexitCode ) { "Successfully closed " + $Lock.AppName + "'s lock on " + $Lock.FilePath}
}
}
}
现在,如果您想对目录中的所有文件执行此操作,只需获取所有文件,然后在文件的 FullName
属性上运行 ForEach 循环。然后您应该能够毫无问题地删除该目录。
编辑:这是指向 Handle.exe 网页的链接:https://technet.microsoft.com/en-us/sysinternals/bb896655.aspx (感谢 Kev,因为我懒得自己查了。。感谢 Kev!)
关于windows - 在 Windows 上,如何终止所有在目录中打开文件的进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30744385/