View Full Version : [batch][altro] controllo dimensione più cartelle
bobo779256
10-01-2022, 16:56
Avrei bisogno di tenere sott'occhio la dimensione di alcune cartelle e magari ricevere un avviso visivo se tali cartelle superano un tot di gigabyte occupati o che si avvicina al massimo possibile, solo visuale
Esempio, una cartella dovrà contenere massimo 10GB, eseguendo lo script\programma\quel_che_è se l'occupazione arriva vicino a 10 o superiore deve comparire una avviso
Purtroppo non ne capisco nulla di programmazione nè di script avanzati, se non un po' di batch DOS, infatti allego ciò che ho partorito documentandomi in rete:
::
:: Visualizza la dimensione e la quantita' di file
:: di 3 cartelle, rimane aperta la finestra con i risultati
::
@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION
:: tipi di file da cercare con dir
SET target=*.m* *.w*
:: percorsi in cui cercare, da modificare alla bisogna
SET pA=D:\00NEWxprove
SET pB=D:\0Ap
SET pC=D:\gtx
:: se esiste cancella d2.txt, file di output
IF EXIST %TEMP%\d2.txt DEL /Q %TEMP%\d2.txt
:: parametri comando DIR, togliere /-C per visualizzare separatori migliaia
SET oP= /S/-C
:: richiama la procedura per ogni percorso
:: ed accoda il risultato a d2.txt
CALL :ACCODA %pA%
CALL :ACCODA %pB%
CALL :ACCODA %pC%
:: visualizza risultato e cancella d2.txt
TYPE %TEMP%\d2.txt
ECHO.&ECHO.&ECHO Premi un tasto due volte per uscire
PAUSE > nul
ECHO.&ECHO.&ECHO Premi ancora un tasto
PAUSE > nul
DEL /Q %TEMP%\d2.txt
ENDLOCAL
EXIT /B
:ACCODA
:: cambia cartella attiva
CD /D "%~1"
:: crea d.txt come output comando dir
FOR /F "tokens=*" %%A in ('DIR %oP% %target%') DO ECHO %%A >> %TEMP%\d.txt
:: cancella l'ultimo rigo di d.txt
SET FN=%TEMP%\d.txt
FOR /f "tokens=* delims= " %%c in (!FN!) DO (
SET str=%%c
)
FIND /v "!str!" < !FN! > %TEMP%\d1.txt
:: mette in d2.txt ultimo rigo di d1.txt
:: con file e dimensioni
SET FN=%TEMP%\d1.txt
FOR /f "tokens=* delims= " %%c in (!FN!) DO (
SET str=%%c
)
:: accoda a d2.txt i risultati
ECHO %str% >> %TEMP%\d2.txt
ECHO %~1 >> %TEMP%\d2.txt
:: cancella file di appoggio
DEL /Q %TEMP%\d.txt %TEMP%\d1.txt
EXIT /B
che visualizza in una finestra del prompt le tre cartelle con i relativi file\byte occupati
Ma mi sono scontrato con l'impossibilità di eseguire calcoli con cifre troppo grandi, ed inoltre non saprei come far visualizzare eventuali avvisi
Ho provato a cercare programmini adattabili allo scopo ma non ne ho trovati, se non i classici FolderSize e simili
Qualche anima pia che mi da qualche consiglio o aiuto?
Grazie
nel set di comandi windows, c'è il comodo diruse.exe senza dover scomodare script
https://ss64.com/nt/diruse.html
bobo779256
10-01-2022, 17:12
Non esiste in Win10, da dove la prendo?
Trovato un equivalente della Sysinternals, DU
Ma è lo stesso, come faccio a fare apparire avvisi e fare calcoli?
diruse.exe fa parte di un gruppo di utility di Microsoft. Se cerchi in rete lo trovi.
forse questo è equivalente https://docs.microsoft.com/en-us/sysinternals/downloads/du
bobo779256
10-01-2022, 17:51
Si, grazie misterx, avevo trovato proprio DU
Ma c'è un problema... mi da valori errati rispetto a Esplora file di Windows, chissa perchè...
guarda se entrano in goco file di sistema e quindi nascosti
bobo779256
10-01-2022, 21:07
No, niente file sistema\nascosti
Quindi... boh!
x_Master_x
11-01-2022, 07:09
Cerca di passare a qualcosa di più avanzato, come VBS o PowerShell.
La sintassi è semplice, ma ti apre un nuovo mondo di possibilità (per quanto sia fattibile con i batch, ma come vedi meno codice, più leggibile)
VBS
Dim objFSO, myFolders, Folder, objFolder, sizeFolder
Set objFSO = CreateObject("Scripting.FileSystemObject")
myFolders = Array("C:\Cartella_1","C:\Cartella_2", "C:\Cartella_3")
For Each Folder In myFolders
If objFSO.FolderExists(Folder) Then
Set objFolder = objFSO.GetFolder(Folder)
sizeFolder = Round(objFolder.Size / 1024 / 1024, 2)
WScript.Echo(Folder & Chr(13) & Chr(10) & (sizeFolder) & " MB")
If sizeFolder >= 1000 Then
WScript.Echo("Dimensione superata per la cartella:" & Chr(13) & Chr(10) & Folder & Chr(13) & Chr(10) & (sizeFolder) & " MB")
End If
End If
Next
No, niente file sistema\nascosti
Quindi... boh!
diruse.exe faceva parte di una qualche raccolta di tools per Windows ed era un programma di soli 14 KB, si deve avere la pazienza di cercare in rete.
bobo779256
11-01-2022, 18:09
@ x_Master_x
è che sono completamente digiuno, non saprei nemmeno da dove cominciare
Consigli su questo? Qualche link da cui iniziare a studiare?
VBS o PowerShell non fa differenza per me, visto che non li conosco entrambi, ma VBS lo vedo più 'logico'
@misterx
ok, ho visto che dalla casa madre andrebbe scaricato tutto un pacchetto, e per avere solo quella funzione non mi pare il caso, continuo a cercare...
Comunque in sostituzione dello script che ho scritto ho provato un programmino che fa le stesse cose, visualizza dimensioni cartelle in modo compatto, TreeSizeFree-Portable, per ora mi arrangio con quello
Ma anche lo script VBS messo da x_Master_x sarebbe ottimo, lo devo solo adattare allo scopo (ad esempio dovrebbe visualizzare in contemporanea nella stessa finestrella dimensioni cartelle e se supera o meno un valore stabilito per ognuna di esse)
Grazie ad entrambi
ho scoperto il perchè della differenza in byte tra DU e Esplora file, ed è più preciso DU (DU segna più di Esplora file)
Esplora file non conteggia alcune funzioni nascoste dei file NTFS, in questo caso la 'Zone.Identifier' memorizzata come Alternate Data Stream nel file, sarebbe la voce che compare facendo destro sul file\proprietà e a volte compare sotto 'Sicurezza: il file proviene da un altro computer ecc...' e la spunta 'Annulla blocco', se annullo il blocco per tutti i file presenti nella cartella allora i valori coincidono al byte
x_Master_x
11-01-2022, 19:27
Qualsiasi risorsa online va bene per i VBS, se usi i batch alla fine ti basta giusto imparare la sintassi di base, if, cicli ecc
Comunque non ho capito il risultato che vorresti. Una finestra (?) che aggiorna i valori in dimensioni di queste cartelle in "tempo reale" (quantificare il tempo reale? Ogni quanto?) te li mostra a schermo sempre e ti avvisa quando supera?
Se lo scopo è sapere quando una di queste cartelle supera il valore x, basta quello che ho fatto. Togli il primo WScript.Echo, lascia il secondo. Quindi a quel punto ti appare la finestra quando solo una delle directory supera il valore x. Con pianifica attività, imposti un task che lancia lo script ogni 5 minuti a ciclo infinito. Se appare la finestra, sai perché e chi.
senza voler scomodare programmi esterni ed usando le risorse del sistema operativo, ti ho messo insieme questo mio vecchio script che mi sono stancato di testare :D (non mi occupo più di sistemistica) e lo lascio a te come compito, così puoi dire di aver partecipato. Buon lavoro e buon divertimento.
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
del ListaFile.txt
del OutPut.txt
dir C:\miadir /s /b /a:-d >>ListaFile.txt
set /a t=0
set /a g=1048576
FOR /F "tokens=* delims=" %%a IN (ListaFile.txt) DO (
set k=%%~za
set /a t+=k/g
echo %%a [%%~za]>>OutPut.txt
)
echo ------------>>OutPut.txt
echo Totale: %t% >>OutPut.txt
echo ------------>>OutPut.txt
settando la seguente riga:
set /a g=1048576
converti i byte che ti vengono restituiti in MB dato che il valore ritornato dal batch è in byte, insomma, lavoraci un po su.
Perseverance
11-01-2022, 19:45
Gestione delle quote
https://docs.microsoft.com/it-it/windows-server/storage/fsrm/quota-management
Creare quote per limitare lo spazio consentito per un volume o una cartella e generare notifiche quando si avvicinano o superano i limiti di quota.
bobo779256
12-01-2022, 09:43
@ Perseverance
Non ho mai usato la gestione quote per cartelle ma dal link che hai messo sembra sia possibile nelle varie versioni Server di Win, con la mia 10 Pro credo posso gestire solo quote disco, non cartelle. Sbaglio?
@ misterx
Grazie, vedo e provo
@ x_Master_x
Si, lo scopo attuale è solo sapere se una di queste cartelle supera un tot, dentro sono memorizzati principalmente file audio HD di qualche centinaio di megabyte a brano, ed ogni cartella corrisponde ad una chiavetta USB\lettore audio\smartphone, e questo al momento per due persone (quindi tutto doppio). Avere quindi sott'occhio spazio usato e disponibile per una periferica esterna sarebbe molto utile
Esempio: PINO-carelle 2-per lettore audio max 32GB e smartphone max 64GB, BOBO-cartelle 4-per lettore audio max 256GB, smartphone max 128GB, chiavetta1 USB max 64GB, chiavetta2 USB max 128GB
Provo col tuo VBS
bobo779256
13-01-2022, 16:57
Studiato ed adattato un po' il VBS messo da x_Master_x
Esce fuori questo codice qua:
Dim objFSO, myFolders, Folder, objFolder, sizeFolder, testo, myDim
Set objFSO = CreateObject("Scripting.FileSystemObject")
myFolders = Array("D:\00NEWxprove","D:\0Ap", "D:\gtx")
myDim = Array(1000000000,350000,1000000)
miaVar=0
testo=""
For Each Folder In myFolders
If objFSO.FolderExists(Folder) Then
Set objFolder = objFSO.GetFolder(Folder)
sizeFolder = Round(objFolder.Size, 2)
testo = testo & Folder & Chr(10) & (sizeFolder) & " Byte su "& myDim(miaVar) & Chr(10)
If sizeFolder >= myDim(miaVar) then
testo = testo & "Dimensione superata" & Chr(13) & Chr(13)
Else
testo = testo & Chr(13) & Chr(13)
End If
End If
miaVar=miaVar+1
Next
msgbox (testo)
che da come risultato con delle cartelle e valori di prova:
https://i.postimg.cc/yNt6P7rY/screenshot-148.png (https://postimages.org/)
che è quello che volevo ottenere, far partire lo script alla bisogna e visualizzare quei valori e se superano il limite
Ora studierò ancora per magari rendere più visibili le scritte, come ad esempio aggiungere i separatori delle migliaia ai numeri e qualche colore di sfondo se 'superata', ma già così va bene
Anche il bat proposto da misterx funziona, accantono anche quello magari per usi futuri
[edit]
https://i.postimg.cc/1RYBr2y7/screenshot-149.png (https://postimages.org/)
Trovato anche questo, compare la X rossa e con FormatNumber formatta i numeri, più visibili
Passo e chiudo
[\edit]
x_Master_x
15-01-2022, 10:34
Visto che alla fine non è poi così complesso? Hai fatto un array che si incrementa ad ogni ciclo, aggiunto parametri all'MsgBox e formattato i caratteri. È comunque un altro mondo rispetto ai batch.
P.S. Non hai dichiarato miaVar
bobo779256
15-01-2022, 23:09
Si, modificare ciò che già c'è posso farlo, se dovessi progettare uno script da zero... non saprei come fare al momento
Vero che è tutta un'altra cosa, bisogna solo provare, provare, pro...
Per il P.S. è vero, ma non avevo nemmeno messo il codice finale... che metto 'mo, potrebbe essere di ispirazione ad altri
Dim objFSO, myFolders, Folder, objFolder, sizeFolder, testo, myDim, miaVar, pul
Set objFSO = CreateObject("Scripting.FileSystemObject")
myFolders = Array("D:\00NEWxprove","D:\0Ap", "D:\gtx")
myDim = Array(1000000000,350000,1000000)
miaVar = 0 : pul = 0 : testo = ""
For Each Folder In myFolders
If objFSO.FolderExists(Folder) Then
Set objFolder = objFSO.GetFolder(Folder)
sizeFolder = Round(objFolder.Size, 2)
testo = testo & Folder & Chr(10) & (FormatNumber(sizeFolder,0)) & " Byte su " & FormatNumber(myDim(miaVar),0) & Chr(10)
If sizeFolder >= myDim(miaVar) then
testo = testo & "Dimensione superata" & Chr(13) & Chr(13)
pul = 1
Else
testo = testo & Chr(13) & Chr(13)
End If
End If
miaVar=miaVar+1
Next
msgbox testo, 16*pul, ""
Ancora grazie
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.