Como fechar todos os manipuladores de arquivos em uma determinada pasta programaticamente?

13

Eu queria saber se existe uma ferramenta de linha de comando que me permite fechar todos os identificadores de arquivo que estão abertos em uma pasta específica.

Eu tentei ProcessExplorer , Unlocker e ferramentas similares, mas eles oferecem uma interface GUI e não são úteis em um ambiente de programação

Uma solução em Python, cmd ou PowerShell seria ideal.

    
por Amelio Vazquez-Reina 13.09.2011 / 20:29

8 respostas

7
O

Unlocker afirma que lhe dá essa capacidade:

  1. Simply right click the folder or file and select Unlocker

    Step1

  2. If the folder or file is locked, a window listing of lockers will appear

    Step2

  3. Simply click Unlock All and you are done!

Não tenho certeza se ele suporta o uso da linha de comando.

O FileAssassin do MalwareByte realiza ações similares, e suporta o uso da linha de comando, assim você deve ser capaz de fazer scripts facilmente.

    
por 13.09.2011 / 20:49
9

Obrigado por isso. Temos tido alguns problemas com identificadores de arquivos abertos, fazendo com que o git checkouts falhe em nossos trabalhos do Jenkins baseados no Windows, e isso ajudou a corrigir o problema com facilidade. Vou jogar fora o básico da técnica:

  1. Instale o Handle.exe no nó de compilação. Eu baixei do link , descompactei e soltei o Handle.exe em C: \ Windows \ System32 para garantir que estaria disponível no% PATH%

  2. padrão
  3. Instale o plugin pré-scm-buildstep do Jenkins: link . Isso nos permite definir operações antes que o plug-in git comece a procurar arquivos potencialmente bloqueados.

  4. Implementou o seguinte comando em lote como uma etapa de criação pré-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
    

Parece funcionar bem e definitivamente reduz as falhas espúrias. Também observarei algumas pegadinhas pelas quais trabalhei:

  • O Handler.exe tem um EULA que deve ser aceito na primeira vez que for executado. Se você estiver executando o seu agente Jenkins como um serviço no contexto do Sistema Local, isso é problemático porque você não pode efetuar login como esse usuário e aceitá-lo manualmente. Quando tentamos executá-lo a partir do trabalho de Jenkins, o processo ficou pendurado à espera da entrada do usuário e demorou alguns minutos para descobrir o motivo. Eu resolvi isso executando-o a partir do trabalho de Jenkins usando o sinalizador / accepteula e recomendo que qualquer pessoa que implemente isso como um processo automatizado faça o mesmo. Isso acontece de ser uma configuração de registro em HKEY_CURRENT_USER \ Software \ Sysinternals \ Handle e você também pode definir e desabilitá-lo via regedit.exe se você precisar manipulá-lo para um usuário específico, mas a opção de linha de comando pareceu mais fácil.

  • O plugin Jenkins Batch step executa o código do lote como se estivesse em um script e não como uma diretiva de linha de comando. Observe os escapes (por exemplo, %% i, ^ |).

Obrigado!

    
por 19.09.2014 / 01:40
8

Usamos o seguinte snippet para fechar o identificador de arquivos dos usuários para o nosso servidor. Você pode modificá-lo para seu uso.

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

Eu criei este pequeno arquivo em lote para liberar automaticamente todos os bloqueios para o arquivo xml pelo meu 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

Você precisa baixar o utilitário handle do site da Microsoft e < Utilitário strong> grep de GnuWin32

Se você não precisa filtrar por tipo de arquivo, você pode pular a parte do grep assim:

@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

Ou, se você não precisar filtrar bloqueios por um programa específico, basta remover o filtro de processo do 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

Lembre-se de substituir e:\git\ pelo caminho da sua pasta.

    
por 24.07.2014 / 01:51
4

Se você estiver falando sobre identificadores de arquivos abertos por meio de um compartilhamento SMB em um servidor de arquivos do Windows (Server 2012 ou mais recente), aqui está a resposta do PowerShell:

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

Em um servidor de arquivos antigo do Windows, é openfiles.exe /disconnect .

Para um identificador de arquivo de sistema local, a melhor maneira que encontrei é usar Sysinternals handle.exe

    
por 24.01.2017 / 20:17
3

Se você estiver usando PSTools , isso forçará a fechar todos os arquivos abertos de forma recursiva:

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

Observe que c:\path\toDatabase\ é a unidade C: em \serverName , não sua máquina local. Isso não ficou claro para mim no início, então pensei em apontar.

Esta é uma abordagem de força bruta que quase certamente perderá dados, portanto, use-a com cuidado.

Nós temos um banco de dados do Access mal remendado que literalmente traz a nossa empresa aos seus joelhos em uma base regular (eu tive que corrigi-lo três vezes apenas ontem).

O cara que normalmente lida com isso está de férias por algumas semanas e suas instruções usam uma abordagem baseada em interface do usuário (Iniciar > Computador > Gerenciar > Gerenciamento do computador (local) > Conectar a outro computador > > Pastas compartilhadas > Abrir os arquivos > Fechar os arquivos abertos). COMO muitos cliques quando posso executar o comando & chutar toda a empresa de todos os arquivos de banco de dados & iniciar o Compact & Processo de reparo (no qual também estou trabalhando em uma abordagem de script de força bruta).

O truque é ficar à frente das pessoas que imediatamente começam a se reconectar ao banco de dados assim que ele desce. Eles estão tão acostumados a isso que não lhes ocorre registrar um bug contra eles, eles simplesmente continuam martelando o banco de dados até que eles voltem. Eu apenas continuo inicializando-os até que eu tenha compactado o & reparou as três dúzias de arquivos que compõem o banco de dados.

    
por 02.12.2014 / 16:42
2

O Unlocker também pode ser executado no modo silencioso.

Por exemplo, para desbloquear todos os arquivos dentro do espaço de trabalho do Jenkins:

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

Em seguida, você pode excluir com segurança os arquivos do espaço de trabalho:

del "%WORKSPACE%\*.*" /s /q
    
por 18.08.2015 / 14:15
1

Eu prefiro o link porque ele suporta tanto a GUI quanto a interface de linha de comando e, em muitos casos, foi capaz de excluir arquivos que não puderam ser excluídos pelo Unlocker .

    
por 21.08.2013 / 00:49

Tags