किसी दिए गए फ़ोल्डर के तहत सभी फ़ाइल हैंडल को प्रोग्रामिक रूप से कैसे बंद करें?


18

मैं सोच रहा था कि क्या कोई कमांड-लाइन टूल है जो मुझे एक विशिष्ट फ़ोल्डर के तहत खुले सभी फ़ाइल हैंडल को बंद करने की अनुमति देता है।

मैंने ProcessExplorer , Unlocker और इसी तरह के उपकरणों की कोशिश की है , लेकिन वे GUI इंटरफ़ेस की पेशकश करते हैं, और एक प्रोग्रामिंग वातावरण में उपयोगी नहीं हैं

पायथन, cmd या PowerShell पर एक समाधान आदर्श होगा।


याद रखें कि फ़ाइल हैंडल को जबरन बंद करने से उस हैंडल का क्रैश होने के कारण प्रोग्राम हो सकता है।
हैरी जॉन्सटन

1
@HarryJohnston इससे भी बदतर, जब तक कि कार्यक्रम खुला है, तब तक आप सभी प्रकार के फ़ाइल भ्रष्टाचार का कारण बन सकते हैं: Technet.microsoft.com/en-us/magazine/…
Bob

जवाबों:


7

अनलॉकर का दावा है कि यह आपको यह क्षमता देता है:

  1. बस फ़ोल्डर या फ़ाइल पर राइट क्लिक करें और अनलॉकर का चयन करें

    चरण 1

  2. यदि फ़ोल्डर या फ़ाइल लॉक है, तो लॉकर्स की एक विंडो लिस्टिंग दिखाई देगी

    चरण 2

  3. बस क्लिक करें Unlock Allऔर आप कर रहे हैं!

मुझे यकीन नहीं है कि यह कमांड-लाइन उपयोग का समर्थन करता है।

MalwareByte का FileAssassin समान कार्य करता है, और कमांड-लाइन उपयोग का समर्थन करता है , इसलिए आपको बहुत आसानी से स्क्रिप्ट करने में सक्षम होना चाहिए।

FileAssassin के स्विच


धन्यवाद Techie007, मुझे लगता है कि मुझे याद किया। मैंने देखा कि अनलॉकर कभी-कभी मेरी फ़ाइलों को याद करता है (ProcessExplorer नहीं) .. एक दूसरा मुद्दा यह है कि क्या मैं प्रोग्राम को अनलॉक या रिलीज़ करना चाहता हूं (जैसे कमांड लाइन टूल इस दिशा में मदद करेगा)।
एमिलियो वाज़केज़-रीना

@intrpc वहाँ फिर जाओ, मैंने एक और (कमांड-लाइन-फ्रेंडली) सुझाव जोड़ा। :)
ᴇc --ιᴇ007

1
सावधान, अनलॉकर इन दिनों मैलवेयर के साथ बंडल में आता है।
जोशुआ हैनली

10

इसके लिए धन्यवाद। हम खुले फ़ाइल हैंडल के साथ कुछ समस्याएँ पैदा कर रहे हैं, जिससे हमारे विंडोज-आधारित जेनकिंस नौकरियों में असफल चेकआउट विफल हो गए हैं और इसने समस्या को सही तरीके से ठीक किया। मैं तकनीक की मूल बातें बाहर फेंक दूँगा:

  1. निर्माण नोड पर Handle.exe स्थापित करें। मैंने इसे यहाँ से डाउनलोड किया http://technet.microsoft.com/en-us/sysinternals/bb896655 , इसे अनज़िप कर दिया और C: \ Windows \ System32 के तहत Handle.exe गिरा दिया ताकि यह सुनिश्चित हो सके कि यह डिफ़ॉल्ट PATH% पर उपलब्ध होगा

  2. जेनकिंस प्री-स्कम-बिल्डस्टेप प्लगइन स्थापित करें: https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep । यह संभावित प्लग इन फ़ाइलों के लिए पहुंच शुरू होने से पहले हमें संचालन को परिभाषित करने की अनुमति देता है।

  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 है जिसे पहली बार चलने पर स्वीकार किया जाना चाहिए। यदि आप अपने जेनकींस एजेंट को स्थानीय प्रणाली के संदर्भ में एक सेवा के रूप में चला रहे हैं, तो यह समस्याग्रस्त है क्योंकि आप उस उपयोगकर्ता के रूप में लॉग इन नहीं कर सकते हैं और इसे हाथ से स्वीकार नहीं कर सकते हैं। जब हमने इसे जेनकिंस की नौकरी से चलाने की कोशिश की, तो प्रक्रिया को केवल उपयोगकर्ता इनपुट की प्रतीक्षा थी और यह पता लगाने में कुछ मिनट लग गए कि क्यों। मैंने इसे जेनकींस जॉब से / एक्सेलेयुला फ्लैग का उपयोग करके इसे हल किया और मैं किसी को भी इसे लागू करने की सलाह देता हूं क्योंकि यह एक स्वचालित प्रक्रिया है। यह HKEY_CURRENT_USER \ Software \ Sysinternals \ Handle के अंतर्गत एक रजिस्ट्री सेटिंग के रूप में होता है और आप इसे regedit.exe के माध्यम से सेट और अनसेट भी कर सकते हैं यदि आपको इसे किसी विशिष्ट उपयोगकर्ता के लिए हेरफेर करने की आवश्यकता है, लेकिन कमांड लाइन विकल्प आसान लग रहा था।

  • जेनकिंस बैच स्टेप प्लगइन बैच कोड निष्पादित करता है जैसे कि यह स्क्रिप्ट में कमांड लाइन निर्देश के रूप में था। नोट नोटिस (उदाहरण %% i, ^ |) |

धन्यवाद!


इसका वाक्य-विन्यास पाने के लिए, क्या कोई व्यक्ति %% i, j आदि में अधिक विस्तार प्रदान कर सकता है?
c4sh

यह बैच कमांड के सिंटैक्स को समझने में मदद कर सकता है: robvanderwoude.com/ntfortokens.php
c4sh

आप लोगों ने इस तथ्य को कैसे हल किया कि 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

धन्यवाद @ ब्रेंडन मुझे लगता है कि आपका कोड ठीक से फ़ॉर्मेट नहीं किया गया था। आपका उत्तर दिलचस्प लग रहा है, इसलिए यदि आपको इसे संपादित करने में कोई आपत्ति नहीं है, तो मैं आपको सुझाव दूंगा कि आप कोड की अपनी पंक्तियों का चयन करें, और फिर दो कर्ली कंगन वाले बटन पर क्लिक करें। जो आपके स्निपेट को पठनीय कोड में बदल देगा।
एमिलियो वाज़केज़-रीना

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

आपको Microsoft साइट से हैंडल उपयोगिता और GnuWin32 से grep उपयोगिता डाउनलोड करने की आवश्यकता है

यदि आपको फ़ाइल प्रकार द्वारा फ़िल्टर की आवश्यकता नहीं है, तो आप इस तरह से 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\अपने फ़ोल्डर पथ से प्रतिस्थापित करना याद रखें ।


5

यदि आप Windows फ़ाइल सर्वर (सर्वर 2012 या नए) पर एक SMB शेयर के माध्यम से खुलने वाली फ़ाइलों के बारे में बात कर रहे हैं, तो यहां PowerShell देखें:

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

पुराने Windows फ़ाइल सर्वर पर, यह है openfiles.exe /disconnect

एक स्थानीय सिस्टम फ़ाइल हैंडल के लिए, मैंने जो सबसे अच्छा तरीका पाया है वह है Sysinternals handle.exe का उपयोग करना


4

यदि आप PSTools का उपयोग कर रहे हैं , तो यह सभी खुली हुई फ़ाइलों को पुन: सहेजने के लिए बाध्य करेगा:

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

ध्यान दें कि c:\path\toDatabase\C: ड्राइव है \\serverName, न कि आपकी स्थानीय मशीन। यह मेरे लिए अस्पष्ट था इसलिए मैंने सोचा कि मैं इसे इंगित करूँगा।

यह एक क्रूर बल दृष्टिकोण है जो डेटा खोने की लगभग गारंटी है, इसलिए सावधानी के साथ इसका उपयोग करें।

हमने एक्सेस डेटाबेस पर बुरी तरह से मोहर लगाई है जो हमारी कंपनी को नियमित रूप से घुटने के बल खड़ा करती है (मुझे कल ही इसे तीन बार ठीक करना था)।

जो व्यक्ति सामान्य रूप से इसे संभालता है वह कुछ हफ़्ते के लिए छुट्टी पर होता है और उसके निर्देश यूआई आधारित दृष्टिकोण का उपयोग करते हैं (प्रारंभ> कंप्यूटर> प्रबंधित करें> कंप्यूटर प्रबंधन (स्थानीय)> किसी अन्य कंप्यूटर से कनेक्ट करें> सिस्टम टूल> साझा फ़ोल्डर> खुली फ़ाइलें> बंद करें खुली फ़ाइलें)। बहुत सारे क्लिक तब हो सकते हैं जब मैं उपरोक्त कमांड चला सकता हूं और पूरी कंपनी को सभी डेटाबेस फाइलों से बाहर निकाल सकता हूं और कॉम्पैक्ट एंड रिपेयर प्रक्रिया शुरू कर सकता हूं (जो कि मैं एक ब्रूट फोर्स स्क्रिप्टेड एप्रोच पर भी काम कर रहा हूं)।

यह ट्रिक उन लोगों से आगे रह रही है जो नीचे जाते ही तुरंत डेटाबेस को फिर से जोड़ना शुरू कर देते हैं। वे इस के लिए उपयोग किए जाते हैं कि यह उनके खिलाफ बग दर्ज करने के लिए नहीं होता है, वे बस डेटाबेस को तब तक दबाए रखते हैं जब तक वे वापस नहीं आते। मैं बस उन्हें तब तक बूट करता रहता हूं जब तक कि मैंने कॉम्पैक्ट नहीं किया और तीन दर्जन की मरम्मत की। डेटाबेस बनाने वाली फ़ाइलें।


3

मैं http://lockhunter.com को पसंद करता हूं क्योंकि यह GUI और कमांड लाइन इंटरफ़ेस दोनों का समर्थन करता है, और कई मामलों में उन फ़ाइलों को हटाने में सक्षम था जो अनलॉकर द्वारा हटाए नहीं जा सकते थे।


2

अनलॉकर साइलेंट मोड में भी चल सकता है।

उदाहरण के लिए, जेनकिंस कार्यक्षेत्र के अंदर सभी फ़ाइलों को अनलॉक करने के लिए:

"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/de हटाना-contents-of-a-folder-contain-files-with-open-file-handles-use-powershell /

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.