Bagaimana cara menutup semua pegangan file di bawah folder yang diberikan secara terprogram?

18

Saya bertanya-tanya apakah ada alat baris perintah yang memungkinkan saya untuk menutup semua pegangan file yang terbuka di bawah folder tertentu.

Saya telah mencoba ProcessExplorer , Unlocker dan alat serupa, tetapi mereka menawarkan antarmuka GUI, dan tidak berguna dalam lingkungan pemrograman

Solusi pada Python, cmd atau PowerShell akan ideal.

Amelio Vazquez-Reina
sumber
Ingatlah bahwa menutup pegangan file secara paksa dapat menyebabkan program menggunakan pegangan itu macet.
Harry Johnston
1
@ HarryJohnston Lebih buruk lagi, Anda bisa berakhir menyebabkan segala macam korupsi file selama program ini terbuka: technet.microsoft.com/en-us/magazine/…
Bob

Jawaban:

7

Unlocker mengklaim itu memberi Anda kemampuan ini:

  1. Cukup klik kanan folder atau file dan pilih Unlocker

    Langkah 1

  2. Jika folder atau file terkunci, daftar jendela loker akan muncul

    Langkah 2

  3. Cukup klik Unlock Alldan Anda selesai!

Saya tidak yakin apakah itu mendukung penggunaan baris perintah.

MalwareByte ini FileAssassin melakukan tindakan serupa, dan tidak mendukung penggunaan baris perintah, sehingga Anda harus dapat script itu cukup mudah.

Switch FileAssassin's

Ƭᴇcʜιᴇ007
sumber
Terima kasih techie007, saya rasa saya melewatkan itu. Saya perhatikan bahwa Unlocker terkadang melewatkan file-file saya (ProcessExplorer tidak) .. Masalah kedua adalah jika saya ingin membuka atau melepaskan file secara programatis (mis. Alat baris perintah akan membantu sepanjang arah ini).
Amelio Vazquez-Reina
@ intrpc Nah ya, saya menambahkan saran lain (command-line-friendly). :)
Ƭᴇcʜιᴇ007
1
Hati-hati, Unlocker dibundel dengan malware hari ini.
Joshua Hanley
10

Terima kasih untuk ini. Kami telah mengalami beberapa masalah dengan pegangan file terbuka yang menyebabkan git checkout gagal dalam pekerjaan Jenkins kami yang berbasis Windows dan ini membantu memperbaiki masalah dengan mudah. Saya akan membuang dasar-dasar teknik ini:

  1. Instal Handle.exe pada build node. Saya mengunduhnya dari sini http://technet.microsoft.com/en-us/sysinternals/bb896655 , membuka ritsletingnya dan menjatuhkan Handle.exe di bawah C: \ Windows \ System32 untuk memastikan itu akan tersedia di default% PATH%

  2. Instal plugin Jenkins pre-scm-buildstep: https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep . Ini memungkinkan kita untuk mendefinisikan operasi sebelum plugin git mulai meraih file yang berpotensi terkunci.

  3. Menerapkan perintah batch berikut sebagai langkah membangun pra-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
    

Tampaknya bekerja dengan baik dan pasti mengurangi kegagalan palsu. Saya juga akan mencatat beberapa Gotcha yang saya kerjakan:

  • Handler.exe memiliki EULA yang harus diterima saat pertama kali dijalankan. Jika Anda menjalankan agen Jenkins sebagai layanan di bawah konteks Sistem Lokal, ini bermasalah karena Anda tidak bisa masuk sebagai pengguna itu dan menerimanya dengan tangan. Ketika kami mencoba menjalankannya dari pekerjaan Jenkins, proses hanya menunggu input pengguna dan butuh beberapa menit untuk mencari tahu mengapa. Saya memecahkan ini dengan menjalankannya dari pekerjaan Jenkins menggunakan flag / accepteula dan saya merekomendasikan siapa pun yang mengimplementasikan ini sebagai proses otomatis melakukan hal yang sama. Ini kebetulan merupakan pengaturan registri di bawah HKEY_CURRENT_USER \ Software \ Sysinternals \ Handle dan Anda juga dapat mengatur dan menghapusnya melalui regedit.exe jika Anda perlu memanipulasinya untuk pengguna tertentu, tetapi opsi baris perintah sepertinya lebih mudah.

  • Plugin langkah Jenkins Batch mengeksekusi kode batch seolah-olah itu dalam skrip bukan sebagai perintah baris perintah. Perhatikan lolos (mis. %% i, ^ |).

Terima kasih!

Thomas Boyles
sumber
Berjuang untuk mendapatkan sintaksis ini, dapatkah seseorang memberikan lebih detail tentang apa %% i, j etc?
c4sh
Ini mungkin membantu untuk memahami sintaks dari perintah batch: robvanderwoude.com/ntfortokens.php
c4sh
Bagaimana Anda memecahkan fakta bahwa handle.exe perlu dijalankan sebagai administrator, sementara kami menjalankannya dari pengguna Jenkins yang bukan admin?
c4sh
8

Kami menggunakan cuplikan berikut untuk menutup pegangan file dari pengguna ke server kami. Anda mungkin dapat memodifikasinya untuk Anda gunakan.

rem close all network files that are locked
for /f "skip=4 tokens=1" %%a in ('net files') do net files %%a /close
Brendan
sumber
Terima kasih @ Brendan. Saya pikir kode Anda tidak diformat dengan benar. Jawaban Anda terlihat menarik, jadi jika Anda tidak keberatan mengeditnya, saya sarankan Anda memilih baris kode Anda, lalu klik tombol dengan dua gelang keriting. Itu akan mengubah cuplikan Anda menjadi kode yang dapat dibaca.
Amelio Vazquez-Reina
5

Saya membuat file batch kecil ini untuk secara otomatis melepaskan semua kunci ke file xml oleh gerhana saya

@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

Anda perlu mengunduh utilitas pegangan dari situs Microsoft dan utilitas grep dari GnuWin32

Jika Anda tidak perlu memfilter menurut jenis file, Anda dapat melewati bagian grep seperti ini:

@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

Atau jika Anda tidak perlu memfilter kunci oleh program tertentu, cukup hapus filter proses gerhana:

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

Ingatlah untuk mengganti e:\git\dengan jalur folder Anda.

coolersport
sumber
4

Jika Anda menggunakan PSTools , ini akan memaksa menutup semua file yang terbuka secara rekursif:

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

Perhatikan bahwa c:\path\toDatabase\drive C: aktif \\serverName, bukan mesin lokal Anda. Ini tidak jelas bagi saya pada awalnya jadi saya pikir saya akan menunjukkannya.

Ini adalah pendekatan brute force yang hampir dijamin kehilangan data, jadi gunakan dengan hati-hati.

Kami memiliki database Access yang buruk dan berbatu yang benar-benar membuat perusahaan kami berlutut secara teratur (saya harus memperbaikinya tiga kali kemarin).

Orang yang biasanya menangani ini sedang berlibur selama beberapa minggu dan instruksinya menggunakan pendekatan berbasis UI (Mulai> Komputer> Kelola> Manajemen Komputer (Lokal)> Sambungkan ke komputer lain> Peralatan Sistem> Folder Bersama> Buka File> Tutup Buka File). JALAN terlalu banyak klik ketika saya bisa menjalankan perintah di atas & mengeluarkan seluruh perusahaan dari semua file database & memulai proses Compact & Perbaikan (yang saya juga sedang mengerjakan pendekatan skrip brute force untuk).

Triknya adalah tetap di depan orang-orang yang segera mulai menyambung kembali ke database segera setelah turun. Mereka sudah terbiasa dengan hal ini sehingga tidak terpikir oleh mereka untuk mengajukan bug terhadapnya, mereka terus memalu database sampai mereka kembali. Saya terus mem-boot-nya sampai saya memadatkan & memperbaiki tiga lusin file yang membentuk database.

delliottg
sumber
4

Jika Anda berbicara tentang menangani file yang terbuka melalui share SMB pada server file Windows (Server 2012 atau yang lebih baru), inilah jawaban PowerShell:

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

Di server file Windows yang lebih lama, itu openfiles.exe /disconnect.

Untuk menangani file sistem lokal, cara terbaik yang saya temukan adalah menggunakan Sysinternals handle.exe

Joshua Hanley
sumber
3

Saya lebih suka http://lockhunter.com karena mendukung antarmuka GUI dan command line, dan dalam banyak kasus dapat menghapus file yang tidak dapat dihapus oleh Unlocker.

Vladimir Reshetnikov
sumber
2

Unlocker juga dapat dijalankan dalam mode diam.

Misalnya, untuk membuka kunci semua file di dalam ruang kerja Jenkins:

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

Maka Anda dapat menghapus file ruang kerja dengan aman:

del "%WORKSPACE%\*.*" /s /q
Noam Manos
sumber
0

Anda dapat menggunakan Powershell untuk melakukan hal ini:

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
        }
    }
}

Untuk lebih jelasnya, lihat Thomas Ardal di sini: https://thomasardal.com/deleting-contents-of-a-folder-containing-files-with-open-file-handles-using-powershell/

Abhi
sumber