windows - 在 Windows 上,如何终止所有在目录中打开文件的进程?

标签 windows powershell

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/

相关文章:

javascript - 是否可以通过 Javascript 终止 SharePoint 工作流?

windows - 我应该如何使用批处理脚本来创建其他脚本?

c++ - 使用 WindowsCreateStringReference 与 WindowsCreateString 取消分配 HSTRING

visual-studio - 如何使用 PowerShell 添加许可证文件作为自定义 NuGet 包的一部分

powershell - 调用函数时变量不更新

powershell - 运行docker redis实例无法访问redis

powershell - 自动检索受限语言模式的允许类型

c++ - Winsock - 在 C++ 中从 Java 客户端读取整数

c - 从第三个连接开始Winsock错误10038

linux - 虚拟机能否像基于硬件的操作系统一样高效?