在Windows中,如何终止所有正在使用某个目录中文件的进程?

3

Windows中一个非常令人沮丧的“特性”是,进程锁定文件并阻止删除目录。

我正在寻找一种方法来查找所有在该目录中打开文件的进程,类似于Unix上的“lsof”。我正在寻找一些powershell魔法,而且我不想购买一些自定义维护工具。

1个回答

7

我有好消息和坏消息。我先说坏消息……我还没有找到一种严格在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!)

不要忘记链接到 handle.exe:https://technet.microsoft.com/zh-cn/sysinternals/bb896655.aspx - Kev
脚本实际上会引导用户前往sysinternals.com网站,如果找不到可执行文件。我想人们一旦进入该网站就可以找到它。 - TheMadTechnician
1
公平的说,我没有向右滚动足够远,其他人可能也不会阅读那段文字,这在现今经常发生。 - Kev
我担心如果我必须先测试目录中的每个文件,这可能会变得有点慢 - 另一方面,我想我可以尝试一个“rd”,然后只测试剩下的文件... - Christian Goetze

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