วิธีการปิดการจัดการไฟล์ทั้งหมดภายใต้โฟลเดอร์ที่กำหนดโดยทางโปรแกรม?


18

ฉันสงสัยว่ามีเครื่องมือบรรทัดคำสั่งที่ช่วยให้ฉันปิดการจัดการไฟล์ทั้งหมดที่เปิดภายใต้โฟลเดอร์เฉพาะ

ฉันได้ลองProcessExplorer , Unlockerและเครื่องมือที่คล้ายกัน แต่มีอินเตอร์เฟส GUI และไม่มีประโยชน์ในสภาพแวดล้อมการเขียนโปรแกรม

ทางออกของ Python, cmd หรือ PowerShell น่าจะเหมาะสมที่สุด


โปรดจำไว้ว่าการบังคับให้ปิดการจัดการไฟล์อาจทำให้โปรแกรมที่ใช้การจัดการนั้นล้มเหลว
Harry Johnston

1
@HarryJohnston แย่ลงคุณสามารถทำให้ไฟล์เสียหายได้ทุกประเภทตราบใดที่โปรแกรมเปิดอยู่: technet.microsoft.com/en-us/magazine/…
Bob

คำตอบ:


7

Unlockerอ้างว่ามันช่วยให้คุณมีความสามารถนี้:

  1. เพียงคลิกขวาที่โฟลเดอร์หรือไฟล์แล้วเลือก Unlocker

    ขั้นตอนที่ 1

  2. หากโฟลเดอร์หรือไฟล์ถูกล็อครายชื่อหน้าต่างของตู้เก็บของจะปรากฏขึ้น

    ขั้นตอนที่ 2

  3. เพียงคลิกUnlock Allและคุณทำเสร็จแล้ว!

ฉันไม่แน่ใจว่ารองรับการใช้งานบรรทัดคำสั่งหรือไม่

MalwareByte ของ FileAssassinดำเนินการกระทำที่คล้ายกันและไม่สนับสนุนการใช้งานบรรทัดคำสั่งดังนั้นคุณควรจะสามารถสคริปต์มันสวยได้อย่างง่ายดาย

FileAssassin Switches


ขอบคุณ techie007 ฉันคิดว่าฉันพลาดไป ฉันสังเกตเห็นว่า Unlocker บางครั้งคิดถึงไฟล์ของฉัน (ProcessExplorer ไม่) .. ปัญหาที่สองคือถ้าฉันต้องการปลดล็อกหรือปล่อยไฟล์โดยทางโปรแกรม (เช่นเครื่องมือบรรทัดคำสั่งจะช่วยในทิศทางนี้)
Amelio Vazquez-Reina

@intrpc ใช่แล้วฉันได้เพิ่มข้อเสนอแนะอื่น ๆ :)
Ƭᴇcʜιᴇ007

1
ระวัง Unlocker มาพร้อมกับมัลแวร์ทุกวันนี้
Joshua Hanley

10

ขอบคุณสำหรับสิ่งนี้. เราได้รับปัญหาบางอย่างเกี่ยวกับการจัดการไฟล์เปิดทำให้การตรวจสอบคอมไพล์ล้มเหลวภายในงาน Jenkins ที่ใช้ Windows ของเราและสิ่งนี้ช่วยแก้ไขปัญหาได้อย่างคล่องแคล่ว ฉันจะทิ้งพื้นฐานของเทคนิค:

  1. ติดตั้ง Handle.exe บนโหนดสร้าง ฉันดาวน์โหลดจากที่นี่http://technet.microsoft.com/en-us/sysinternals/bb896655 , คลายซิปมันแล้วปล่อย Handle.exe ไว้ภายใต้ C: \ Windows \ System32 เพื่อให้แน่ใจว่าจะสามารถใช้งานได้ใน% PATH% เริ่มต้น

  2. ติดตั้งเจนกินส์ก่อน 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
    

ดูเหมือนว่าจะทำงานได้ดีและแน่นอนลดความล้มเหลวของปลอม ฉันยังจะทราบสองสาม gotchas ฉันทำงานผ่าน:

  • Handler.exe มี EULA ที่ต้องยอมรับในครั้งแรกที่เรียกใช้ หากคุณกำลังเรียกใช้ตัวแทนเจนกินส์ของคุณเป็นบริการภายใต้บริบทของระบบภายในระบบนี่เป็นปัญหาเนื่องจากคุณไม่สามารถเข้าสู่ระบบในฐานะผู้ใช้รายนั้นและยอมรับด้วยมือ เมื่อเราลองเรียกใช้งานจากงานของเจนกินส์กระบวนการก็จะหยุดรอการป้อนข้อมูลของผู้ใช้และใช้เวลาสักครู่เพื่อหาสาเหตุ ฉันแก้ไขสิ่งนี้ได้ด้วยการเรียกใช้งานจากงาน Jenkins โดยใช้ธง / accepteula และฉันขอแนะนำให้ทุกคนที่ใช้สิ่งนี้เป็นกระบวนการอัตโนมัติทำเช่นเดียวกัน สิ่งนี้เกิดขึ้นกับการตั้งค่ารีจิสทรีภายใต้ HKEY_CURRENT_USER \ Software \ Sysinternals \ Handle และคุณยังสามารถตั้งค่าและยกเลิกการตั้งค่าผ่าน regedit.exe หากคุณต้องการจัดการกับผู้ใช้เฉพาะ แต่ตัวเลือกบรรทัดคำสั่งดูง่ายที่สุด

  • ปลั๊กอินขั้นตอน Jenkins Batch เรียกใช้งานแบตช์ราวกับว่าอยู่ในสคริปต์แทนที่จะเป็นคำสั่งบรรทัดคำสั่ง สังเกตเห็นทางหนี (เช่น %% i, ^ |)

ขอบคุณ!


การดิ้นรนเพื่อให้ได้ไวยากรณ์ของสิ่งนี้ใครสามารถให้รายละเอียดเพิ่มเติมว่าอะไรคือ %% i, j และอื่น ๆ ?
c4sh

สิ่งนี้อาจช่วยให้เข้าใจไวยากรณ์ของคำสั่งแบทช์: robvanderwoude.com/ntfortokens.php
c4sh

พวกคุณแก้ปัญหาได้อย่างไรว่า handle.exe ต้องทำงานเป็นผู้ดูแลระบบในขณะที่เราเรียกใช้จากผู้ใช้ Jenkins ที่ไม่ใช่ผู้ดูแลระบบ
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 แบบอัตโนมัติโดย eclipse ของฉัน

@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และยูทิลิตี้grepจาก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

หรือถ้าคุณไม่ต้องการกรองการล็อคโดยโปรแกรมใดโปรแกรมหนึ่งเพียงแค่ลบตัวกรองกระบวนการ eclipse:

@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ไม่ใช่ในเครื่องของคุณ ตอนแรกมันไม่ชัดเจนสำหรับฉันดังนั้นฉันคิดว่าฉันจะชี้ให้เห็น

นี่เป็นวิธีการที่ดุร้ายที่รับรองได้ว่าเกือบจะสูญเสียข้อมูลดังนั้นควรใช้ด้วยความระมัดระวัง

เรามีฐานข้อมูลที่ปูด้วยกันอย่างไม่ดีเข้าด้วยกันซึ่งทำให้ บริษัท ของเราคุกเข่าเป็นประจำ (ฉันต้องแก้ไขมันสามครั้งเมื่อวานนี้)

คนที่จัดการเรื่องนี้อยู่ในช่วงพักร้อนเป็นเวลาสองสามสัปดาห์และคำแนะนำของเขาใช้วิธีการแบบ UI (เริ่ม> คอมพิวเตอร์> จัดการ> การจัดการคอมพิวเตอร์ (ในพื้นที่)> เชื่อมต่อกับคอมพิวเตอร์เครื่องอื่น> เครื่องมือระบบ> โฟลเดอร์ที่ใช้ร่วมกัน> เปิดไฟล์> ปิด เปิดไฟล์) วิธีการคลิกมากเกินไปเมื่อฉันสามารถเรียกใช้คำสั่งด้านบนและเตะ บริษัท ทั้งหมดออกจากไฟล์ฐานข้อมูลทั้งหมดและเริ่มกระบวนการ Compact & Repair (ซึ่งฉันกำลังทำงานในวิธีการที่ดุร้ายกำลังสคริปต์)

เคล็ดลับอยู่ข้างหน้าของผู้ที่เริ่มเชื่อมต่อกับฐานข้อมูลทันทีที่มันล่ม พวกเขาคุ้นเคยกับสิ่งนี้ไม่ให้เกิดปัญหากับพวกเขาพวกเขาเพียงแค่ทำการตอกฐานข้อมูลจนกว่าพวกเขาจะกลับมาฉันจะทำการบูตพวกเขาต่อไปจนกว่าฉันจะอัด & ซ่อมแซมสามโหล ไฟล์ที่ประกอบเป็นฐานข้อมูล


4

หากคุณกำลังพูดถึงการจัดการไฟล์ที่เปิดผ่านการแชร์ SMB บนเซิร์ฟเวอร์ไฟล์ Windows (เซิร์ฟเวอร์ 2012 หรือใหม่กว่า) นี่คือคำตอบของ PowerShell:

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

บนเซิร์ฟเวอร์แฟ้ม Windows openfiles.exe /disconnectเก่ามันเป็น

สำหรับหมายเลขอ้างอิงไฟล์ระบบโลคัลวิธีที่ดีที่สุดที่ฉันพบคือใช้Sysinternals handle.exe


3

ฉันชอบhttp://lockhunter.comเพราะรองรับทั้ง GUI และอินเตอร์เฟสบรรทัดคำสั่งและในหลายกรณีก็สามารถลบไฟล์ที่ Unlocker ไม่สามารถลบได้


2

Unlocker สามารถทำงานในโหมดเงียบได้เช่นกัน

ตัวอย่างเช่นหากต้องการปลดล็อกไฟล์ทั้งหมดภายในพื้นที่ทำงาน 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
        }
    }
}

สำหรับรายละเอียดเพิ่มเติมอ้างอิง Thomas Ardal ที่นี่: 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.