특정 폴더 아래에 열려있는 모든 파일 핸들을 닫을 수있는 명령 줄 도구가 있는지 궁금합니다.
나는 시도 ProcessExplorer , 의 Unlocker 와 비슷한 도구를하지만 그들은 GUI 인터페이스를 제공하며, 프로그래밍 환경에서 유용하지 않다
Python, cmd 또는 PowerShell에 대한 솔루션이 이상적입니다.
특정 폴더 아래에 열려있는 모든 파일 핸들을 닫을 수있는 명령 줄 도구가 있는지 궁금합니다.
나는 시도 ProcessExplorer , 의 Unlocker 와 비슷한 도구를하지만 그들은 GUI 인터페이스를 제공하며, 프로그래밍 환경에서 유용하지 않다
Python, cmd 또는 PowerShell에 대한 솔루션이 이상적입니다.
답변:
Unlocker 는 다음과 같은 기능을 제공한다고 주장합니다.
폴더 또는 파일을 마우스 오른쪽 버튼으로 클릭하고 Unlocker를 선택하십시오.
폴더 나 파일이 잠겨 있으면 사물함의 목록이 나타납니다
- 간단히 클릭
Unlock All하면 완료됩니다!
명령 줄 사용법을 지원하는지 잘 모르겠습니다.
MalwareByte의 FileAssassin은 유사한 작업을 수행하고, 않습니다 당신이 그것을 아주 쉽게 스크립트 할 수 있어야하므로, 지원 명령 줄 사용을.

고마워 Windows 기반 Jenkins 작업에서 열린 파일 핸들에 문제가 발생하여 git checkouts가 실패하여 문제를 수동으로 해결하는 데 도움이되었습니다. 이 기술의 기초를 버리겠습니다.
빌드 노드에 Handle.exe를 설치하십시오. 여기에서 http://technet.microsoft.com/en-us/sysinternals/bb896655 에서 다운로드하여 압축을 풀고 C : \ Windows \ System32 아래에 Handle.exe를 기본 % PATH %에서 사용할 수 있도록 삭제했습니다.
Jenkins pre-scm-buildstep 플러그인을 설치하십시오 ( https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep) . 이를 통해 git 플러그인이 잠긴 파일에 도달하기 전에 작업을 정의 할 수 있습니다.
다음 배치 명령을 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, ^ |).
감사!
다음 스 니펫을 사용하여 사용자에서 서버로 파일 핸들을 닫습니다. 사용하기 위해 수정할 수 있습니다.
rem close all network files that are locked
for /f "skip=4 tokens=1" %%a in ('net files') do net files %%a /close
이 작은 배치 파일을 만들어 내 일식으로 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\폴더 경로 로 바꿔야 합니다.
PSTools를 사용하는 경우 열려있는 모든 파일을 재귀 적으로 강제로 닫습니다.
psfile \\serverName c:\path\toDatabase\ -c
참고 c:\path\toDatabase\는 C 있습니다 : 드라이브 \\serverName가 아닌 로컬 컴퓨터. 처음에는 불분명했기 때문에 지적하겠다고 생각했습니다.
이것은 데이터를 잃을 가능성이 거의없는 무차별 접근 방식이므로주의해서 사용하십시오.
우리는 문자 그대로 회사를 정기적으로 무릎을 꿇게하는 Access 데이터베이스를 잘못 모았습니다 (어제 3 번 수정해야했습니다).
일반적으로이 문제를 처리하는 사람은 몇 주 동안 휴가 중이며 UI 지침 (시작> 컴퓨터> 관리> 컴퓨터 관리 (로컬)> 다른 컴퓨터에 연결> 시스템 도구> 공유 폴더> 파일 열기> 닫기 파일 열기). 위의 명령을 실행하고 모든 데이터베이스 파일에서 회사 전체를 쫓아 내고 압축 및 복구 프로세스를 시작하면 너무 많은 클릭이 발생합니다 (이는 무차별 대입 스크립트 방식으로 작업하고 있습니다).
트릭은 데이터베이스가 다운되는 즉시 데이터베이스에 다시 연결하기 시작하는 사람들보다 앞서 있습니다. 그것들은 버그에 대해 버그를 제기하지 않기 위해 너무 익숙해 져 있습니다. 그들은 다시 돌아올 때까지 데이터베이스를 계속 망치고 있습니다. 데이터베이스를 구성하는 파일.
Windows 파일 서버 (Server 2012 이상)에서 SMB 공유를 통해 열린 파일 핸들에 대해 이야기하는 경우 PowerShell 답변은 다음과 같습니다.
Get-SmbOpenFile | Where-Object { $_.Path -like "D:\Folder\*" } | Close-SmbOpenFile -Force
오래된 Windows 파일 서버에서는 openfiles.exe /disconnect입니다.
로컬 시스템 파일 핸들의 경우 내가 찾은 가장 좋은 방법은 Sysinternals handle.exe 를 사용하는 것입니다.
GUI와 명령 줄 인터페이스를 모두 지원하기 때문에 http://lockhunter.com을 선호 하며 많은 경우 Unlocker에서 삭제할 수없는 파일을 삭제할 수있었습니다.
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/