Script per chiusura di file aperti

Talvolta, soprattutto su server datati può essere necessario chiudere file che rimangono erroneamente aperti quando utilizzati dagli utenti tramite share per i motivi più svariati (applicazioni che si bloccano o non gestiscono correttamente la chiusura dei file utilizzati, eventuali errori di rete, blocchi inaspettati della sessione lavoro o utenti RDS che non eseguono il logoff).

Di seguito uno script DOS pensato per server senza supporto a PowerShell in cui basta impostare il path della cartella di cui si intende chiudere i file trovati aperti:

@ECHO OFF
SET FOLDERPATH=C:\Shared\

REM Ricerca file aperti
FOR /f “Skip=8 tokens=1,4 delims=,” %%i in (‘OPENFILES /QUERY /FO CSV /NH’) DO (
CALL :CloseFile %%i “%%j”
)

GOTO :EOF

:CloseFile
SET ID=%1
SET ID=%ID:~1,-1%
SET ITEM=%2
SET ITEM=%ITEM:~1,-1%
SET ITEM=%ITEM:~1,-1%

REM Controllo Path iniziante col contenuto della variabile FOLDERPATH
ECHO %ITEM%|FINDSTR /I /B /C:%FOLDERPATH% > nul
IF NOT ErrorLevel 1 (
ECHO Chiusura file %ID% %ITEM%
OPENFILES /DISCONNECT /ID %ID%
)

Lo script utilizza il comando OPENFILES che permette di ricercare e chiudere i file aperti, per ottenere i dati completi occorre utilizzate la modalità CSV (tramite il parametro  /FO CSV ) in  quanto la modalità di default (TABLE) potrebbe troncare i dati.

Ovviamente in PowerShell le cose si semplificano parecchio soprattutto grazie ai comandi Get-SmbOpenFile e Close-SmbOpenFile introdotti in Windows PowerShell 4.0 e supportati nativamente da WS2012 R2/W8.1. Infatti utilizzando PowerShell lo script si riduce drasticamente:

Get-SmbOpenFile | Where-Object -Property Path -Like “C:\Shared\*” | Close-SmbOpenFile –Force

A riguardo si veda PowerTip: Close Open SMB File Shares with PowerShell.