Me preguntaba si hay una herramienta de línea de comandos que me permita cerrar todos los controladores de archivo que están abiertos en una carpeta específica.
He probado ProcessExplorer , Unlocker y herramientas similares, pero ofrecen una interfaz GUI y no son útiles en un entorno de programación.
Una solución en Python, cmd o PowerShell sería ideal.
Respuestas:
Unlocker afirma que te da esta habilidad:
No estoy seguro de si es compatible con el uso de la línea de comandos.
FileASSASSIN de Malwarebyte realiza acciones similares, y lo hace de soporte el uso de línea de comandos, por lo que debe ser capaz de guión muy fácilmente.
fuente
Gracias por esto. Hemos tenido algunos problemas con los identificadores de archivos abiertos que hacen que los pagos de git fallen en nuestros trabajos de Jenkins basados en Windows y esto ayudó a corregir el problema fácilmente. Explicaré los conceptos básicos de la técnica:
Instale Handle.exe en el nodo de compilación. Lo descargué desde aquí http://technet.microsoft.com/en-us/sysinternals/bb896655 , lo descomprimí y solté Handle.exe en C: \ Windows \ System32 para asegurarme de que estaría disponible en el% PATH% predeterminado
Instale el complemento Jenkins pre-scm-buildstep: https://wiki.jenkins-ci.org/display/JENKINS/pre-scm-buildstep . Esto nos permite definir operaciones antes de que el complemento git comience a alcanzar archivos potencialmente bloqueados.
Implementé el siguiente comando por lotes como un paso de compilación pre-scm:
Parece funcionar bien y definitivamente reduce las fallas espurias. También notaré un par de problemas con los que trabajé:
Handler.exe tiene un EULA que debe aceptarse la primera vez que se ejecuta. Si está ejecutando su agente Jenkins como un servicio en el contexto del Sistema local, esto es problemático porque no puede iniciar sesión como ese usuario y aceptarlo a mano. Cuando intentamos ejecutarlo desde el trabajo de Jenkins, el proceso simplemente se detuvo a la espera de la entrada del usuario y tardó unos minutos en descubrir por qué. Resolví esto ejecutándolo desde el trabajo de Jenkins usando el indicador / acceptteula y recomiendo que cualquiera que implemente esto como un proceso automatizado haga lo mismo. Esto pasa a ser una configuración de registro en HKEY_CURRENT_USER \ Software \ Sysinternals \ Handle y también puede configurarlo y desactivarlo a través de regedit.exe si necesita manipularlo para un usuario específico, pero la opción de línea de comandos parecía más fácil.
El complemento de paso de Jenkins Batch ejecuta el código de lote como si estuviera en un script en lugar de como una directiva de línea de comando. Observe los escapes (por ejemplo, %% i, ^ |).
¡Gracias!
fuente
Utilizamos el siguiente fragmento para cerrar el identificador de archivo de los usuarios a nuestro servidor. Es posible que pueda modificarlo para su uso.
fuente
Creo este pequeño archivo por lotes para liberar automáticamente todos los bloqueos al archivo xml con mi eclipse
Debe descargar la utilidad de manejo del sitio de Microsoft y la utilidad grep de GnuWin32
Si no necesita filtrar por tipo de archivo, puede omitir la parte grep como esta:
O si no necesita filtrar bloqueos por un programa en particular, simplemente elimine el filtro del proceso de eclipse:
Recuerde reemplazar
e:\git\
con la ruta de su carpeta.fuente
Si está utilizando PSTools , esto obligará a cerrar todos los archivos abiertos de forma recursiva:
psfile \\serverName c:\path\toDatabase\ -c
Tenga en cuenta que
c:\path\toDatabase\
es el C: conduzca\\serverName
, no su máquina local. Al principio no estaba claro para mí, así que pensé en señalarlo.Este es un enfoque de fuerza bruta que casi garantiza la pérdida de datos, así que úselo con precaución.
Tenemos una base de datos de Access mal improvisada que literalmente pone a nuestra empresa de rodillas regularmente (tuve que arreglarlo tres veces ayer).
El tipo que normalmente maneja esto está de vacaciones durante un par de semanas y sus instrucciones usan un enfoque basado en la interfaz de usuario (Inicio> Computadora> Administrar> Administración de la computadora (local)> Conectarse a otra computadora> Herramientas del sistema> Carpetas compartidas> Abrir archivos> Cerrar Abrir archivos). DEMASIADO demasiados clics cuando puedo ejecutar el comando anterior y expulsar a toda la empresa de todos los archivos de la base de datos e iniciar el proceso de Compactar y reparar (que también estoy trabajando en un enfoque de fuerza bruta).
El truco es mantenerse por delante de las personas que inmediatamente comienzan a volver a conectarse a la base de datos tan pronto como se cae. Están tan acostumbrados a esto que no se les ocurre presentar un error contra él, simplemente siguen martillando la base de datos hasta que vuelven a entrar. Simplemente sigo arrancándolos hasta que he compactado y reparado las tres docenas archivos que componen la base de datos.
fuente
Si está hablando de los identificadores de archivos abiertos a través de un recurso compartido SMB en un servidor de archivos de Windows (Server 2012 o posterior), aquí está la respuesta de PowerShell:
En un servidor de archivos de Windows anterior, es
openfiles.exe /disconnect
.Para un identificador de archivo de sistema local, la mejor manera que he encontrado es utilizar Sysinternals handle.exe
fuente
Prefiero http://lockhunter.com porque admite tanto la interfaz gráfica de usuario como la interfaz de línea de comandos, y en muchos casos pude eliminar archivos que Unlocker no pudo eliminar.
fuente
Unlocker también puede ejecutarse en modo silencioso.
Por ejemplo, para desbloquear todos los archivos dentro del espacio de trabajo de Jenkins:
Luego puede eliminar de forma segura los archivos del espacio de trabajo:
fuente
Puedes usar Powershell para hacer esto:
Para obtener más información, consulte Thomas Ardal aquí: https://thomasardal.com/deleting-contents-of-a-folder-containing-files-with-open-file-handles-using-powershell/
fuente