Taille partition ok en ligne de commandes mais pas en batch

Fermé
brucine Messages postés 17867 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 novembre 2024 - 30 juil. 2021 à 16:27
brucine Messages postés 17867 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 novembre 2024 - 6 août 2021 à 17:48
Bonjour,

Je cherche à envoyer l'espace total de la partition C: vers une variable.
Aucun problème pour retrouver "l'information" à la ligne de commandes, par exemple:


C:\Users\bru\Desktop>wmic logicaldisk get name,size | find /i "C:"
C: 268626804736


En octets, mais ça, après, j'en fais mon affaire.

Par contre, j'ai beau tourner ça dans tous les sens dans une sentence FOR que je ne trouve aucun moyen d'obtenir le résultat dans un batch par exemple avec quelque chose de ce genre:

FOR /F "tokens=2 delims=" %%T in ('wmic logicaldisk get name^,size^|find /i "C:"') do echo %%T


J'ai d'ailleurs le même souci avec une ligne elle me renvoyant le nom du disque si c'est un HDD:


FOR /F "skip=1 tokens=1 delims=" %%C in ('wmic /NameSpace:\\root\Microsoft\Windows\Storage Path MSFT_PhysicalDisk Where "MediaType='3'" Get Model') do SET hd=%%C


sans compter que, dans ce dernier cas, je reçois du fait de l'itération et bien qu'il n'y ait qu'un HDD une ligne "écho désactivé"

Merci.

Configuration: Windows / Firefox 90.0
A voir également:

1 réponse

barnabe0057 Messages postés 14453 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 24 novembre 2024 4 917
Modifié le 30 juil. 2021 à 17:31
Salut brucine,

Dans ta première boucle FOR, pour corriger le problème il suffit d'utiliser : comme délimiteur

Dans ta dernière boucle FOR tu peux rajouter un FINDSTR . ou bien FINDSTR /V /R "^$" comme ceci :
FOR /F "skip=1 tokens=1 delims=" %%C in ('wmic /NameSpace:\\root\Microsoft\Windows\Storage Path MSFT_PhysicalDisk Where "MediaType=3" Get Model ^| FINDSTR .') do echo.%%C



0
brucine Messages postés 17867 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 novembre 2024 2 607
30 juil. 2021 à 19:06
Merveilleux,

Le premier, je m'étais posé la question quant à savoir si les points faisaient ou non partie de la donnée (lecteur c:), puis ça m'était sorti de l'idée.
Quant au deuxième, en effet, je n'avais pas trouvé la bonne syntaxe FINDSTR.

Il ne me reste plus qu'à faire mes comptes d'apothicaire pour convertir mes octets en Go (RAM) voire plus gros (disques).

Merci beaucoup.
0
barnabe0057 Messages postés 14453 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 24 novembre 2024 4 917 > brucine Messages postés 17867 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 novembre 2024
Modifié le 30 juil. 2021 à 19:58
Tu pourrais utiliser un batch hybride (Powershell) pour convertir tes octets, par exemple :
@echo off

set "valeur=2 329 092 096"
set "valeur=%valeur: =%"

if not exist "%~dp0DisplayBytes.ps1" (call :scriptPS)

for /f "delims=" %%A in ('powershell -file "%~dp0DisplayBytes.ps1" %valeur%') do echo.%valeur% octets = %%A

echo. & pause
exit

:scriptPS
If Exist "%tmp%\cbf0.0.8.c63c989d2f3c984276f1ec3ecd87af78" goto:cbf.c63c989d2f3c984276f1ec3ecd87af78
(Set/p =JHN1ZmZpeCA9ICJCIiwgIktCIiwgIk1CIiwgIkdCIiwgIlRCIiwgIlBCIiwgIkVCIiwgIlpCIiwgIllCIg0KJGluZGV4ID0gMA0KJG51bT0kYXJnc1swXQ0Kd2hpbGUgKCRudW0gLWd0IDFrYikgDQp7DQogICAgJG51bSA9ICRudW0gLyAxa2INCiAgICAkaW5kZXgrKw0KfSANCg0KInswOk4yfSB7MX0iIC1mICRudW0sICRzdWZmaXhbJGluZGV4XQ==
)<Nul>"%tmp%\cbf0.0.8.c63c989d2f3c984276f1ec3ecd87af78"
:cbf.c63c989d2f3c984276f1ec3ecd87af78
>Nul Certutil -f -decode "%tmp%\cbf0.0.8.c63c989d2f3c984276f1ec3ecd87af78" "%~dp0DisplayBytes.ps1"
goto :eof

Tu peux faire des tests en modifiant la variable valeur
0
brucine Messages postés 17867 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 novembre 2024 2 607 > barnabe0057 Messages postés 14453 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 24 novembre 2024
30 juil. 2021 à 21:06
Oui, je sais, et même certaines des fonctions tordues d'information logicielle et matérielle que j'ai mises dans mon fichier sont infiniment plus simples en Powershell, mais il faut que ça passe partout pour le commun des mortels et sans appeler Powershell d'un batch, c'est plus "compréhensible".

Il y a aussi probablement une question de compatibilité bien que je sois malhonnête puisque utilisant wmic (absent pour XP Home) et fsutil (droits administrateur).

De toute façon, c'est la vieillerie, ce soir, tout va mal; j'ai depuis longtemps un batch éprouvé qui transforme n'importe quelle valeur d'octets depuis quelques dizaines jusqu'à plusieurs dizaines de To (le problème, c'est le raccourci avec le tilde avec le minimum de perte dans chaque gamme, puisqu'on se fait jeter dès que le chiffre dépasse 2 EXP 32).

Et ce soir, s'agissant d'une quantité négligeable équivalente à quelques Go (RAM Disponible), je me fais jeter parce que le truc veut bien diviser par 1024 mais pas multiplier par 1000 (pour garder la précision en enlevant les chiffres par la droite, et même si je pinaille, puisque l'on aura beau en enlever 6 que l'on n'aura perdu que epsilon).

Demain, il fera jour...
0
brucine Messages postés 17867 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 novembre 2024 2 607 > brucine Messages postés 17867 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 novembre 2024
30 juil. 2021 à 21:43
Je me suis fait avoir à mon propre jeu, il est donc vraiment temps que je remette à demain: 5 Go de RAM disponible multiplié par 1000, ça suffit à dépasser la limite fatidique et c'est pour ça que ça plante, plus donc qu'à recommencer demain avec mon script, qui calcule le nombre de chiffres selon la taille et tronque au minimum en conséquence.

Je t'épargne à cette heure les considérations logarithmiques, un calcul batch est planté dès 10 chiffres d'octets correspondant à autour de 2 Go.
0
brucine Messages postés 17867 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 25 novembre 2024 2 607 > barnabe0057 Messages postés 14453 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 24 novembre 2024
Modifié le 1 août 2021 à 13:09
Bonjour,

Nouvelles du front. Pour la réduction des chiffres, c'était quand même assez exotique.
La taille en octets de la partition est bien rendue via wmic à 12 chiffres en-dessous de 1 To, soit 3 de trop, mais pour réduire à 9, il faut saisir:

SET SIZETOT=%totalsize:~0,-6%

Vive l'arithmétique...
Pas mieux concernant la RAM disponible que cette fois-ci systeminfo rend par exemple 4 780 (l'espace n'est pas une coquille), et il faut donc à nouveau tricher pour calculer:

SET SIZEMEM=%availableMem:~0,1%%availableMem:~2,3%


Moyennant quoi le résultat obtenu est bon à 2 problèmes cosmétiques près:



L 'opérateur manquant, je ne sais pas puisque tout marche, il faudra que je prenne un moment pour isoler chaque commande pour voir d'où ça vient.

Aucune instance disponible est rendu par:


FOR /F "skip=1 tokens=1 delims=" %%H in ('wmic /NameSpace:\\root\Microsoft\Windows\Storage Path MSFT_PhysicalDisk Where "MediaType=4" Get Model ^| FINDSTR .') do SET ssd=%%H


suivi de la même commande où MediaType=3, puisqu'il n'y a pas de SSD.

La commande ne produit pas de ERRORLEVEL (ou je ne sais pas où aller le chercher) de sorte à me débarrasser de ce message via une conditionnelle.

On peut peut-être tricher en faisant une conditionnelle sur la valeur de Mediatype, qui vaut forcément 3, 4, ou les deux, mais je ne sais pas comment:



Enfin, oui, Powershell, mais pour moi, c'est juste un mot ou presque:

On pourrait jouer ici sur les mots SSD ou HDD:



Ou là, l'inexistence du SSD ne retourne pas un message d'erreur mais un simple retour à la ligne:



A cela près que je n'ai aucune idée de comment retourner le résultat dans une ou deux selon le cas variables de mon batch pour l'y afficher.

Je te saoule encore, merci si tu as le temps et l'envie de t'occuper de la question.
0