Espace occupé disque

Fermé
brucine Messages postés 14229 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 18 avril 2024 - 26 févr. 2022 à 14:43
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 - 27 févr. 2022 à 21:43
Bonjour,

J'ai un batch qui me retourne non pas en octets, mais du Mo à plusieurs To l'espace libre et l'espace total de la lettre de disque que j'y spécifie; on peut sophistiquer en demandant la lettre de destination ou en parcourant tous les disques connectés à la recherche d'un critère particulier (existence, fichier spécifique, numéro de volume...) mais là n'est pas la question.

Je n'ai trouvé que 3 manières d'accéder à l'espace occupé.

Quoi qu'on en lise, la commande DIRUSE issue du Kit de ressources Windows 2000 n'est pas reconnue sous Windows 10.
On peut toujours utiliser du (Sysinternals).
Mais dans ces 2 cas, on ne se limite pas aux "moyens du bord": il faut aller chercher la commande dans le Kit de ressources ou Sysinternals.

Bien sûr, on fait SET /A et la différence entre l'espace total et l'espace libre, mais on tombe sur 2 os:
la limite de calcul à 2^31, et le fait que le calcul des octets en Mo à To passe de ce fait par plusieurs sous-variables (il faut un certain nombre de divisions par 1024 et de multiplications par 1000 puis tronquer à un nombre inférieur à la limite de calcul) et est différent suivant la valeur initiale.

Moralité: je sèche pour trouver une commande Dos ou Windows interne qui comporterait notamment cet espace occupé, quitte ensuite à ce que je fasse mon affaire de l'en extraire.

Merci.
A voir également:

7 réponses

barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
27 févr. 2022 à 10:29
Bonjour brucine,

J'espère que tu vas bien. Je n'ai pas de réelle solution à te proposer car toi et moi savons très bien qu'il n'y en a malheureusement pas.

Je peux te proposer un script de conversion simple qui n'est pas d'une précision absolue mais suffisante pour mon utilisation et peut-être la tienne.

A partir des données que ton script récupère (espace total et espace libre) tu pourrais utiliser mon script comme une fonction qui les convertirait vers l'unité la plus adaptée.

@echo off
setlocal enabledelayedexpansion

set /p espaceLibre="Entrez l'espace libre du volume (en octets) : "
call :conversion "!espaceLibre!" "espaceLibre"

echo. & set /p tailleTotale="Entrez la taille totale du volume (en octets) : "
call :conversion "!tailleTotale!" "tailleTotale" !unite!

set /a espaceOccupe=!tailleTotale!-!espaceLibre!
set "espaceOccupe=!espaceOccupe:~0,-2!,!espaceOccupe:~-2!"

echo. & echo Espace occupé : !espaceOccupe! !unite!

echo. & pause
exit

:conversion

echo. & set gel=0
set "nombre=%~1"

for %%A in (Ko, Mo, Go, To) do (
if "!gel!"=="0" (
if !nombre! GTR 999 (
set "decimal=!nombre:~-3,2!"
set "nombre=!nombre:~0,-3!"
set "unite=%%A"
echo Conversion : !nombre!,!decimal! !unite!
)
)
if "%%A"=="%~3" (set gel=1)
)

set /a "%2=!nombre!!decimal!"

rem echo Conversion : !nombre!,!decimal! !unite!

goto :eof

0
brucine Messages postés 14229 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 18 avril 2024 1 794
27 févr. 2022 à 12:19
Bonjour,

Le script de conversion, je l'ai sinon que j'ai pinaillé avec quelque chose d'un peu "plus précis" (et donc de plus long).

J'ai tout un tas de vieilleries dans mes archives, dont un dossier Ressource Kit Win2K mais dans lequel je n'ai pas trouvé la fameuse commande DIRUSE: parce que j'y avais fait le ménage en n'y conservant qu'un dossier dont je ne sais même plus à quoi il correspond.
Expérience faite pour ceux que cela peut intéresser, on trouve l'ISO du Ressource Kit un peu partout sur le Web et la commande DIRUSE s'y trouve dans filedisk.cab.
C'est la solution la plus simple, on écrit:


FOR /F "usebackq tokens=1 skip=2 delims= " %%F IN (`diruse M:`) DO set "size=%%F"


et on parle d'autre chose, l'inconvénient de cette solution est qu'elle n'est pas native donc portable.

Il y a bien un subterfuge (puisqu'il faut des inconvénients, il ne fonctionne bien sûr que sur Windows en version française):


DIR L: /A-D/W/S |FIND "fichier(s)"|SORT/R |FIND/N "fichier(s)"|FIND "[1]"


mais j'ai encore besoin de toi: le résultat est bon, mais je ne trouve aucun moyen de l'envoyer vers une variable comme dans la syntaxe précédente (comme dans la commande DIR simple, on veut sortir simplement tokens=3).

Merci...
0
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
Modifié le 27 févr. 2022 à 13:45
Je ne vois pas de difficulté particulière, chez moi ceci fonctionne :
FOR /F "tokens=2 delims=)" %%A IN ('DIR C: /A-D/W/S ^| FIND "fichier(s)" ^| SORT/R ^| FIND /N "fichier(s)" ^| FIND "[1]"') DO set "result=%%A"
set "result=%result: =%"
set "result=%result:octets=%"


Personnellement j'aurais simplifié ta commande comme ceci :
FOR /F "tokens=2 delims=)" %%A IN ('DIR C: /A/S ^| FIND "fichier(s)"') DO set "result=%%A"
set "result=%result: =%"
set "result=%result:octets=%"

0
brucine Messages postés 14229 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 18 avril 2024 1 794
27 févr. 2022 à 17:59
J'ai tellement essayé de triturer la sortie que en effet -D/W ne sont pas utiles.

Ta formule simplifiée ne fonctionne pas parce que la commande DIR renvoie autant de lignes "fichiers" qu'il y a de dossiers avec leur taille; la première (et comme d'ailleurs la mienne initiale) non plus puisque le retour en est:


[1] 295 fichier(s) 448 056 676 686 octets


alors qu'on ne veut que le nombre d'octets (avant conversion); ça, c'est capillotracté en passant par un fichier provisoire, mais ça marche, si tu as moins moche, je t'écoute:


chcp 1252
FOR /F "delims=" %%A IN ('DIR L: /A/S ^| FIND "fichier(s)" ^| SORT/R ^| FIND /N "fichier(s)" ^| FIND "[1]"') DO ECHO %%A>%~dp0prov.txt
FOR /F "tokens=4 delims= " %%F in ('type %~dp0prov.txt ^| find "fichier(s)"') DO SET "SIZE=%%F"
DEL %~dp0prov.txt
0
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
27 févr. 2022 à 19:40
La commande DIR peut renvoyer autant de lignes "fichiers" qu'elle veut, nous on cherche juste à récupérer la dernière ligne qui indique le total. Si c'est l'affichage des lignes superflues qui te gène ça peut se régler.
0
brucine Messages postés 14229 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 18 avril 2024 1 794 > barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024
27 févr. 2022 à 19:53
Tout à fait.

Mais pour que la ligne octets (pas libres) soit rendue pour l'ensemble d'un lecteur (et pas seulement tel dossier), je n'ai pas trouvé d'autre cuisine que le commutateur /S, et qui a effet d'afficher le mot "fichier(s)" et l'espace correspondant non pas seulement pour le total mais pour chaque sous-dossier.

D'où la deuxième cuisine (et qui fonctionne mais n'est pas très élégante) de n'afficher que la dernière ligne correspondant au total devenue première par SORT/R puis FIND /N.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
Modifié le 27 févr. 2022 à 20:42
On ne doit pas avoir la même version de windows, sur mon windows 8.1 si je mets ma solution dans un script (qui commence par @echo off) alors je n'ai pas l'affichage des lignes superflues :

@echo off
FOR /F "tokens=2 delims=)" %%A IN ('DIR C: /A/S ^| FIND "fichier(s)"') DO set "result=%%A"
set "result=%result: =%"
set "result=%result:octets=%"
echo %result%
pause


Par contre si je tape directement ma boucle FOR dans une invite de commandes j'obtiens l'affichage des lignes superflues, certainement à cause de l'absence de @echo off

0
brucine Messages postés 14229 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 18 avril 2024 1 794
27 févr. 2022 à 21:14
L'écho est bien dans le fichier de travail, mais le fait qu'il soit zappé évidemment dans des tests à la ligne de commande et aussi dans des bouts de tests batch ne change rien à la situation, et Windows 10 ou 8 non plus.

C'est moi qui suis blond, ce n'est pas mon jour, j'avais initialement pris "295 fichier(s) 448 056 676 686 octets" pour 4 "mots" puis du coup zappé les tokens qui ne retournaient rien; en remettant tokens=2, ça marche tout de suite mieux.

Désolé du dérangement, merci...
0
barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
27 févr. 2022 à 21:43
Ce sont des choses qui arrivent.

Bonne soirée, à la prochaine.
0