주어진 폴더 아래의 모든 파일 핸들을 프로그래밍 방식으로 닫는 방법은 무엇입니까?


18

특정 폴더 아래에 열려있는 모든 파일 핸들을 닫을 수있는 명령 줄 도구가 있는지 궁금합니다.

나는 시도 ProcessExplorer , 의 Unlocker 와 비슷한 도구를하지만 그들은 GUI 인터페이스를 제공하며, 프로그래밍 환경에서 유용하지 않다

Python, cmd 또는 PowerShell에 대한 솔루션이 이상적입니다.


파일 핸들을 강제로 닫으면 해당 핸들을 사용하는 프로그램이 중단 될 수 있습니다.
Harry Johnston

1
@HarryJohnston Worse, 당신은 프로그램이 열려있는 한 모든 종류의 파일 손상을 일으킬 수 있습니다 : technet.microsoft.com/en-us/magazine/…
Bob

답변:


7

Unlocker 는 다음과 같은 기능을 제공한다고 주장합니다.

  1. 폴더 또는 파일을 마우스 오른쪽 버튼으로 클릭하고 Unlocker를 선택하십시오.

    1 단계

  2. 폴더 나 파일이 잠겨 있으면 사물함의 목록이 나타납니다

    2 단계

  3. 간단히 클릭 Unlock All하면 완료됩니다!

명령 줄 사용법을 지원하는지 잘 모르겠습니다.

MalwareByte의 FileAssassin은 유사한 작업을 수행하고, 않습니다 당신이 그것을 아주 쉽게 스크립트 할 수 있어야하므로, 지원 명령 줄 사용을.

FileAssassin의 스위치


감사합니다 techie007, 나는 그것을 놓친 것 같아요. Unlocker가 때때로 내 파일을 놓친 것을 발견했습니다 (ProcessExplorer는 그렇지 않습니다). 두 번째 문제는 프로그래밍 방식으로 파일을 잠금 해제하거나 해제하려는 경우입니다 (예 : 명령 행 도구가이 방향을 따라 도움을 줄 것입니다).
Amelio Vazquez-Reina

@intrpc 거기에 또 다른 (명령 줄 친화적) 제안이 추가되었습니다. :)
Ƭᴇcʜιᴇ007

1
주의, Unlocker는 요즘 멀웨어와 함께 번들로 제공됩니다.
Joshua Hanley

10

고마워 Windows 기반 Jenkins 작업에서 열린 파일 핸들에 문제가 발생하여 git checkouts가 실패하여 문제를 수동으로 해결하는 데 도움이되었습니다. 이 기술의 기초를 버리겠습니다.

  1. 빌드 노드에 Handle.exe를 설치하십시오. 여기에서 http://technet.microsoft.com/en-us/sysinternals/bb896655 에서 다운로드하여 압축을 풀고 C : \ Windows \ System32 아래에 Handle.exe를 기본 % PATH %에서 사용할 수 있도록 삭제했습니다.

  2. Jenkins pre-scm-buildstep 플러그인을 설치하십시오 ( https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep) . 이를 통해 git 플러그인이 잠긴 파일에 도달하기 전에 작업을 정의 할 수 있습니다.

  3. 다음 배치 명령을 SCM 이전 빌드 단계로 구현했습니다.

    @echo off
    echo Cleaning up open file handles from %NODE_NAME%:%WORKSPACE%...
    for /f "tokens=3,6,8 delims=: " %%i in ('Handle /accepteula %WORKSPACE% ^| grep workspace') do echo Releasing file lock on E:%%k & handle -c %%j -y -p %%i
    

그것은 훌륭하게 작동하는 것으로 보이며 가짜 실패를 확실히 줄입니다. 또한 내가 겪은 몇 가지 문제에 주목할 것입니다.

  • Handler.exe에는 EULA가 처음 실행될 때 승인되어야합니다. 로컬 시스템 컨텍스트에서 Jenkins 에이전트를 서비스로 실행하는 경우 해당 사용자로 로그인하여 직접 수락 할 수 없으므로 문제가됩니다. Jenkins 작업에서 실행하려고 시도했을 때 프로세스가 사용자 입력을 기다리는 중이었고 이유를 파악하는 데 몇 분이 걸렸습니다. 나는 / accepteula 플래그를 사용하여 Jenkins 작업 에서이 문제를 해결했으며이를 자동화 된 프로세스로 구현하는 사람은 동일한 작업을 수행하는 것이 좋습니다. 이것은 HKEY_CURRENT_USER \ Software \ Sysinternals \ Handle 아래의 레지스트리 설정이며 특정 사용자를 위해 조작해야하는 경우 regedit.exe를 통해 설정 및 설정 해제 할 수 있지만 명령 행 옵션이 가장 쉬운 것처럼 보입니다.

  • Jenkins Batch 단계 플러그인은 명령 행 지시문이 아닌 스크립트에있는 것처럼 배치 코드를 실행합니다. 이스케이프를 확인하십시오 (예 : %% i, ^ |).

감사!


이것의 구문을 얻는 데 어려움을 겪고있는 사람은 누군가 % % i, j 등을 더 자세히 제공 할 수 있습니까?
c4sh

이것은 배치 명령의 구문을 이해하는 데 도움이 될 수 있습니다. robvanderwoude.com/ntfortokens.php
c4sh

handle.exe가 관리자 권한이 아닌 Jenkins 사용자로부터 실행하는 동안 handle.exe를 관리자 권한으로 실행해야한다는 사실을 어떻게 해결 했습니까?
c4sh

8

다음 스 니펫을 사용하여 사용자에서 서버로 파일 핸들을 닫습니다. 사용하기 위해 수정할 수 있습니다.

rem close all network files that are locked
for /f "skip=4 tokens=1" %%a in ('net files') do net files %%a /close

감사합니다 @Brendan. 귀하의 코드가 올바르게 포맷되지 않은 것 같습니다. 답변이 흥미로워 보이므로 편집하지 않으려면 코드 줄을 선택한 다음 두 개의 곱슬 팔찌가있는 버튼을 클릭하는 것이 좋습니다. 그러면 스 니펫이 읽을 수있는 코드로 바뀝니다.
Amelio Vazquez-Reina

5

이 작은 배치 파일을 만들어 내 일식으로 XML 파일에 대한 모든 잠금을 자동으로 해제합니다.

@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle -p eclipse e:\git\ ^| grep .xml') do echo Releasing %%k & handle -c %%j -y -p %%i

당신은 다운로드 할 필요가 핸들 에서 유틸리티 마이크로 소프트 사이트그렙 에서 유틸리티 GnuWin32을

파일 유형별로 필터가 필요하지 않으면 다음과 같이 grep 부분을 건너 뛸 수 있습니다.

@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle -p eclipse e:\git\') do echo Releasing %%k & handle -c %%j -y -p %%i

또는 특정 프로그램으로 잠금을 필터링 할 필요가 없으면 일식 프로세스 필터를 제거하십시오.

@echo off
for /f "tokens=3,6,8 delims=: " %%i in ('handle e:\git\') do echo Releasing %%k & handle -c %%j -y -p %%i

e:\git\폴더 경로 로 바꿔야 합니다.


4

PSTools를 사용하는 경우 열려있는 모든 파일을 재귀 적으로 강제로 닫습니다.

psfile \\serverName c:\path\toDatabase\ -c

참고 c:\path\toDatabase\는 C 있습니다 : 드라이브 \\serverName가 아닌 로컬 컴퓨터. 처음에는 불분명했기 때문에 지적하겠다고 생각했습니다.

이것은 데이터를 잃을 가능성이 거의없는 무차별 접근 방식이므로주의해서 사용하십시오.

우리는 문자 그대로 회사를 정기적으로 무릎을 꿇게하는 Access 데이터베이스를 잘못 모았습니다 (어제 3 번 수정해야했습니다).

일반적으로이 문제를 처리하는 사람은 몇 주 동안 휴가 중이며 UI 지침 (시작> 컴퓨터> 관리> 컴퓨터 관리 (로컬)> 다른 컴퓨터에 연결> 시스템 도구> 공유 폴더> 파일 열기> 닫기 파일 열기). 위의 명령을 실행하고 모든 데이터베이스 파일에서 회사 전체를 쫓아 내고 압축 및 복구 프로세스를 시작하면 너무 많은 클릭이 발생합니다 (이는 무차별 대입 스크립트 방식으로 작업하고 있습니다).

트릭은 데이터베이스가 다운되는 즉시 데이터베이스에 다시 연결하기 시작하는 사람들보다 앞서 있습니다. 그것들은 버그에 대해 버그를 제기하지 않기 위해 너무 익숙해 져 있습니다. 그들은 다시 돌아올 때까지 데이터베이스를 계속 망치고 있습니다. 데이터베이스를 구성하는 파일.


4

Windows 파일 서버 (Server 2012 이상)에서 SMB 공유를 통해 열린 파일 핸들에 대해 이야기하는 경우 PowerShell 답변은 다음과 같습니다.

Get-SmbOpenFile | Where-Object { $_.Path -like "D:\Folder\*" } | Close-SmbOpenFile -Force

오래된 Windows 파일 서버에서는 openfiles.exe /disconnect입니다.

로컬 시스템 파일 핸들의 경우 내가 찾은 가장 좋은 방법은 Sysinternals handle.exe 를 사용하는 것입니다.



2

잠금 해제 기능도 자동 모드로 실행할 수 있습니다.

예를 들어 Jenkins 작업 공간 내의 모든 파일을 잠금 해제하려면 다음을 수행하십시오.

"C:\Program Files\Unlocker\unlocker.exe" "%WORKSPACE%" /S

그런 다음 작업 공간 파일을 안전하게 삭제할 수 있습니다.

del "%WORKSPACE%\*.*" /s /q

0

Powershell 을 사용 하여이 작업을 수행 할 수 있습니다 .

function KillProcessesWithHandles
{
    param([string]$path)

    $allProcesses = Get-Process

    # Start by closing all notepad processes. Someone may have left a logor config file open
    $allProcesses | Where-Object {$_.Name -eq "notepad"} | Stop-Process -Force -ErrorAction SilentlyContinue

    # Then close all processes running inside the folder we are trying to delete
    $allProcesses | Where-Object {$_.Path -like ($path + "*")} | Stop-Process -Force -ErrorAction SilentlyContinue

    # Finally close all processes with modules loaded from folder we are trying to delete
    foreach($lockedFile in Get-ChildItem -Path $path -Include * -Recurse) {
        foreach ($process in $allProcesses) {
            $process.Modules | Where-Object {$_.FileName -eq $lockedFile} | Stop-Process -Force -ErrorAction SilentlyContinue
        }
    }
}

자세한 내용은 여기 토마스 아르 달을 참조하십시오 https://thomasardal.com/deleting-contents-of-a-folder-containing-files-with-open-file-handles-using-powershell/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.