Belirli bir klasör altındaki tüm dosya tanıtıcıları programlı olarak nasıl kapatılır?


18

Belirli bir klasör altında açık olan tüm dosya tanıtıcılarını kapatmama izin veren bir komut satırı aracı olup olmadığını merak ediyordum.

ProcessExplorer , Unlocker ve benzeri araçları denedim , ancak bir GUI arayüzü sunuyorlar ve bir programlama ortamında kullanışlı değiller

Python, cmd veya PowerShell üzerine bir çözüm ideal olacaktır.


Bir dosya tanıtıcısını zorla kapatmanın bu tanıtıcıyı kullanan programın çökmesine neden olabileceğini unutmayın.
Harry Johnston

1
@HarryJohnston Daha da kötüsü, program açık olduğu sürece her türlü dosya bozulmasına neden olabilirsiniz: technet.microsoft.com/en-us/magazine/…
Bob

Yanıtlar:


7

Unlocker size bu yeteneği verdiğini iddia ediyor:

  1. Klasörü veya dosyayı sağ tıklayın ve Unlocker'ı seçin

    Aşama 1

  2. Klasör veya dosya kilitliyse, dolapların bir pencere listesi görünecektir

    Adım 2

  3. Basitçe tıklayın Unlock Allve işiniz bitti!

Komut satırı kullanımını destekleyip desteklemediğinden emin değilim.

MalwareByte en FileASSASSIN benzer eylemler gerçekleştirir ve yapar bunu oldukça kolay komut gerekir, böylece destek komut satırı kullanımını.

FileAssassin Anahtarları


Teşekkürler techie007, sanırım özledim. Unlocker bazen dosyalarımı özledi fark ettim (ProcessExplorer yok) .. İkinci bir sorun ben dosyaları kilidini veya programlı olarak serbest bırakmak istiyorum (örneğin bir komut satırı aracı bu yönde yardımcı olacaktır).
Amelio Vazquez-Reina

@intrpc İşte, başka bir (komut satırı dostu) öneri ekledim. :)
Ƭᴇcʜιᴇ007

1
Dikkatli olun, Unlocker bugünlerde kötü amaçlı yazılımlarla birlikte geliyor.
Joshua Hanley

10

Bunun için teşekkürler. Windows tabanlı Jenkins işlerimizde git dosyalarının başarısız olmasına neden olan açık dosya tanıtıcılarıyla ilgili bazı sorunlar yaşıyoruz ve bu da sorunun kolayca düzeltilmesine yardımcı oldu. Tekniğin temellerini atacağım:

  1. Handle.exe'yi yapı düğümüne yükleyin. Buradan http://technet.microsoft.com/tr-tr/sysinternals/bb896655 adresini indirdim, sıkıştırmasını kaldırdım ve varsayılan% PATH% üzerinde kullanılabilir olmasını sağlamak için C: \ Windows \ System32 altında Handle.exe dosyasını düşürdüm.

  2. Jenkins pre-scm-buildstep eklentisini yükleyin: https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep . Bu, git eklentisi potansiyel olarak kilitli dosyalara ulaşmaya başlamadan önce işlemleri tanımlamamızı sağlar.

  3. Aşağıdaki toplu iş komutunu bir scm öncesi adım olarak uyguladı:

    @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
    

Güzel çalışıyor gibi görünüyor ve sahte hataları kesinlikle kesiyor. Ayrıca üzerinde çalıştığım bir çift var:

  • Handler.exe, ilk kez çalıştırıldığında kabul edilmesi gereken bir EULA'ya sahiptir. Jenkins aracısını Yerel Sistem bağlamında bir hizmet olarak çalıştırıyorsanız, bu sorunludur, çünkü bu kullanıcı olarak oturum açıp el ile kabul edemezsiniz. Jenkins işinden çalıştırmayı denediğimizde, işlem kullanıcı girişini beklemeye başladı ve nedenini anlamak birkaç dakika sürdü. Bunu, / accepteula bayrağını kullanarak Jenkins işinden çalıştırarak çözdüm ve bunu otomatik bir işlem olarak yapan herkese aynı şeyi tavsiye ederim. Bu HKEY_CURRENT_USER \ Software \ Sysinternals \ Handle altında bir kayıt defteri ayarı olur ve belirli bir kullanıcı için manipüle etmeniz gerekiyorsa regedit.exe aracılığıyla da ayarlayabilir ve ayarını kaldırabilirsiniz, ancak komut satırı seçeneği en kolay görünüyordu.

  • Jenkins Batch adım eklentisi, toplu iş kodunu komut satırı yönergesi yerine komut dosyasındaymış gibi yürütür. Kaçışlara dikkat edin (örn. %% i, ^ |).

Teşekkürler!


Bu sözdizimini almak için mücadele, biri %% i, j vb ne daha fazla ayrıntı sağlayabilir?
c4sh

Bu, toplu komutun sözdizimini anlamaya yardımcı olabilir: robvanderwoude.com/ntfortokens.php
c4sh

Yönetici olmayan bir Jenkins kullanıcısından çalıştırırken handle.exe dosyasının yönetici olarak çalışması gerektiğini nasıl çözdünüz?
c4sh

8

Kullanıcılardan sunucumuza dosya tanıtıcısını kapatmak için aşağıdaki snippet'i kullanıyoruz. Kullanımınız için değiştirebilirsiniz.

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

Teşekkürler @Brendan. Kodunuzun düzgün biçimlendirilmediğini düşünüyorum. Cevabınız ilginç görünüyor, bu yüzden düzenlemeyi önemsemiyorsanız, kod satırlarınızı seçmenizi ve ardından iki kıvırcık bileziğin bulunduğu düğmeyi tıklatmanızı öneririm. Bu, snippet'inizi okunabilir koda dönüştürür.
Amelio Vazquez-Reina

5

Eclipse tarafından xml dosyasına tüm kilitleri otomatik olarak serbest bırakmak için bu küçük toplu iş dosyasını oluşturuyorum

@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

İndirmek için gereken sap gelen programı , Microsoft sitesinden ve grep gelen fayda GnuWin32

Dosya türüne göre filtreye ihtiyacınız yoksa, grep bölümünü şu şekilde atlayabilirsiniz:

@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

Veya kilitleri belirli bir programa göre filtrelemeniz gerekmiyorsa, eclipse işlem filtresini kaldırmanız yeterlidir:

@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\Klasör yolunuzla değiştirmeyi unutmayın .


5

Windows dosya sunucusundaki (Server 2012 veya daha yeni bir sürüm) SMB paylaşımı yoluyla açılan dosya tanıtıcılarından bahsediyorsanız, PowerShell yanıtı aşağıdadır:

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

Eski bir Windows dosya sunucusunda openfiles.exe /disconnect.

Yerel sistem dosya tanıtıcısı için bulduğum en iyi yol Sysinternals handle.exe'yi kullanmaktır


4

PSTools kullanıyorsanız , tüm açık dosyaları tekrar tekrar kapatmaya zorlar:

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

Not c:\path\toDatabase\C: sürücü \\serverNamedeğil, yerel makine. Bu ilk başta benim için belirsizdi, bu yüzden işaret edeceğimi düşündüm.

Bu, veri kaybetmeyi neredeyse garanti eden kaba kuvvet yaklaşımıdır, bu yüzden dikkatli kullanın.

Birlikte kötü bir şekilde Arnavut kaldırımlı Access veritabanımız tam anlamıyla şirketimizi dizlerinin üzerine düzenli olarak getiriyor (sadece üç kez düzeltmek zorunda kaldım).

Bunu normal olarak işleyen adam birkaç hafta tatildir ve talimatları UI tabanlı bir yaklaşım kullanır (Başlat> Bilgisayar> Yönet> Bilgisayar Yönetimi (Yerel)> Başka bir bilgisayara bağlan> Sistem Araçları> Paylaşılan Klasörler> Dosyaları Aç> Kapat Dosyaları aç). WAY çok fazla tıklama sadece yukarıdaki komutu çalıştırmak ve tüm şirket tüm veritabanı dosyaları dışarı tekme ve Kompakt ve Onarım işlemini başlatmak (ki ben de kaba bir kuvvet komut dosyası yaklaşım üzerinde çalışıyorum) başlatmak zaman.

Hile, veritabanına iner inmez hemen yeniden bağlanmaya başlayanların önünde kalıyor. O kadar alışkınlar ki, buna karşı bir hata dosyalamak için kendilerine gelmezler, sadece geri gelene kadar veritabanını çekiçlemeye devam ederler. veritabanını oluşturan dosyalar.



2

Unlocker sessiz modda da çalışabilir.

Örneğin, Jenkins çalışma alanındaki tüm dosyaların kilidini açmak için:

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

Ardından, çalışma alanı dosyalarını güvenle silebilirsiniz:

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

0

Bu işleri yapmak için Powershell'i kullanabilirsiniz :

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

Daha fazla ayrıntı için Thomas Ardal'a buradan bakın: https://thomasardal.com/deleting-contents-of-a-folder-containing-files-with-open-file-handles-using-powershell/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.