Hardware Upgrade Forum

Hardware Upgrade Forum (https://www.hwupgrade.it/forum/index.php)
-   Programmazione (https://www.hwupgrade.it/forum/forumdisplay.php?f=38)
-   -   [batch][altro] controllo dimensione più cartelle (https://www.hwupgrade.it/forum/showthread.php?t=2954745)


bobo779256 10-01-2022 17:56

[batch][altro] controllo dimensione più cartelle
 
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:

Codice:

::
:: 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

misterx 10-01-2022 18:06

nel set di comandi windows, c'è il comodo diruse.exe senza dover scomodare script


https://ss64.com/nt/diruse.html

bobo779256 10-01-2022 18: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?

misterx 10-01-2022 18:37

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/sys...s/downloads/du

bobo779256 10-01-2022 18:51

Si, grazie misterx, avevo trovato proprio DU

Ma c'è un problema... mi da valori errati rispetto a Esplora file di Windows, chissa perchè...

misterx 10-01-2022 19:24

guarda se entrano in goco file di sistema e quindi nascosti

bobo779256 10-01-2022 22:07

No, niente file sistema\nascosti

Quindi... boh!

x_Master_x 11-01-2022 08: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
Codice:

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


misterx 11-01-2022 13:30

Quote:

Originariamente inviato da bobo779256 (Messaggio 47702868)
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 19: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

[edit]
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
[/edit]

x_Master_x 11-01-2022 20: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.

misterx 11-01-2022 20:44

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.

Codice:

@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 20:45

Gestione delle quote
https://docs.microsoft.com/it-it/win...ota-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 10: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 17:57

Studiato ed adattato un po' il VBS messo da x_Master_x
Esce fuori questo codice qua:
Codice:

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:



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]


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 11: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 16-01-2022 00: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
Codice:

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


Tutti gli orari sono GMT +1. Ora sono le: 12:13.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Hardware Upgrade S.r.l.