Fiquei me perguntando se existe uma ferramenta de linha de comando que permita fechar todos os identificadores de arquivo que estão abertos em uma pasta específica.
Eu tentei ProcessExplorer , Unlocker e ferramentas similares, mas elas 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.
Respostas:
O Unlocker afirma que lhe dá esta capacidade:
Não tenho certeza se ele suporta o uso da linha de comando.
FileASSASSIN de Malwarebyte executa ações semelhantes, e faz uso de linha de comando apoio, para que você deve ser capaz de escrevê-lo muito facilmente.
fonte
Obrigado por isso. Temos tido alguns problemas com identificadores de arquivos abertos, causando falhas nos check-ins do git em nossos trabalhos Jenkins baseados no Windows e isso ajudou a corrigir o problema com facilidade. Vou jogar fora o básico da técnica:
Instale o Handle.exe no nó de compilação. Fiz o download aqui http://technet.microsoft.com/en-us/sysinternals/bb896655 , descompactei e soltei o Handle.exe em C: \ Windows \ System32 para garantir que ele estivesse disponível no% PATH% padrão
Instale o plug-in Jenkins pré-scm-buildstep: https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep . Isso nos permite definir operações antes que o plugin git comece a buscar arquivos potencialmente bloqueados.
Implementou o seguinte comando em lote como uma etapa de construção pré-scm:
Parece funcionar bem e definitivamente reduz falhas espúrias. Também observarei algumas dicas pelas quais trabalhei:
Handler.exe possui um EULA que deve ser aceito na primeira vez em que é executado. Se você estiver executando o 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 simplesmente aguardou a entrada do usuário e levou alguns minutos para descobrir o porquê. Resolvi isso executando-o no trabalho Jenkins usando o sinalizador / accepteula e recomendo que qualquer pessoa que implemente isso como um processo automatizado faça o mesmo. Essa é uma configuração de registro em HKEY_CURRENT_USER \ Software \ Sysinternals \ Handle e você também pode defini-la e desabilitá-la através do regedit.exe se precisar manipulá-la para um usuário específico, mas a opção da linha de comando parecia mais fácil.
O plugin da etapa Jenkins Batch executa o código do lote como se estivesse em um script, e não como uma diretiva de linha de comando. Observe as fugas (por exemplo, %% i, ^ |).
Obrigado!
fonte
Usamos o seguinte snippet para fechar a manipulação de arquivos dos usuários para o nosso servidor. Você pode modificá-lo para seu uso.
fonte
Eu crio esse pequeno arquivo em lotes para liberar automaticamente todos os bloqueios para o arquivo xml pelo meu eclipse
Você precisa baixar o utilitário de manipulação do site da Microsoft e o utilitário grep do GnuWin32
Se você não precisar filtrar por tipo de arquivo, poderá pular a parte grep como esta:
Ou, se você não precisar filtrar bloqueios por um programa específico, basta remover o filtro de processo do eclipse:
Lembre-se de substituir
e:\git\
pelo caminho da pasta.fonte
Se você estiver usando o PSTools , isso forçará o fechamento de todos os arquivos abertos recursivamente:
psfile \\serverName c:\path\toDatabase\ -c
Observe que
c:\path\toDatabase\
a unidade C: está ligada\\serverName
, não a máquina local. Isso não estava claro para mim no começo, então pensei em apontar isso.Essa é uma abordagem de força bruta que quase garante a perda de dados, portanto, use-a com cautela.
Temos um banco de dados do Access mal montado que literalmente leva a empresa a ficar de joelhos regularmente (tive que corrigi-lo três vezes ontem).
O cara que normalmente lida com isso fica de férias por algumas semanas e suas instruções usam uma abordagem baseada na interface do usuário (Iniciar> Computador> Gerenciar> Gerenciamento do computador (local)> Conectar-se a outro computador> Ferramentas do sistema> Pastas compartilhadas> Abrir arquivos> Fechar Abrir arquivos). MUITOS cliques quando posso executar o comando acima e expulsar toda a empresa de todos os arquivos de banco de dados e iniciar o processo Compactar e reparar (para o 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 desativa. Eles estão tão acostumados a isso que não lhes ocorre registrar um bug, eles continuam martelando o banco de dados até voltarem. Eu continuo inicializando-os até compactar e reparar as três dúzias arquivos que compõem o banco de dados.
fonte
Se você está 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:
Em um servidor de arquivos Windows mais antigo, é
openfiles.exe /disconnect
.Para um identificador de arquivo do sistema local, a melhor maneira que encontrei é usar o Sysinternals handle.exe
fonte
Eu prefiro o http://lockhunter.com porque suporta GUI e interface de linha de comando e, em muitos casos, foi capaz de excluir arquivos que não puderam ser excluídos pelo Unlocker.
fonte
O Unlocker também pode ser executado no modo silencioso.
Por exemplo, para desbloquear todos os arquivos na área de trabalho do Jenkins:
Em seguida, você pode excluir com segurança os arquivos da área de trabalho:
fonte
Você pode usar o Powershell para fazer isso:
Para obter mais detalhes, consulte Thomas Ardal aqui: https://thomasardal.com/deleting-contents-of-a-folder-containing-files-with-open-file-handles-using-powershell/
fonte