Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

programmation en batc dos

2 réponses
Avatar
pascal leclercq
question ardue pour les administrateurs réseaux!
voila le problème je veux récupérer dans un script la taille du répertoire
ou la taille du disque par exemple dans une variable et faire une opération
de calcul dessus.
j'arrive bien a récupérer la taille de ce dernier mais pour faire un calcul
dessus impossible il me dit que l'opérateur est manquant.
pourquoi ?
si quelqu'un peut m'aider.

voila mon script :

for /F "usebackq tokens=3 delims= " %%i IN (`dir^|find "octets libres"`) DO
set variable=%%i
set /a operation=%variable%/1024
echo %operation%

2 réponses

Avatar
Jean-Claude BELLAMY
"pascal leclercq" a écrit dans le
message de news:
question ardue pour les administrateurs réseaux!


Préalable :
Tu as titré ton message "programmation en batch dos"
NON !
Il n'y a pas de DOS là dedans !
DOS serait bien incapable de faire ce que tu demandes ici !
"Ligne de commandes" ne signifie pas DOS !
Confondre les 2, c'est commettre une très grossière erreur de raisonnement
...
Le titre doit donc être
"programmation en batch"
(sans RIEN d'autre)

voila le problème je veux récupérer dans un script la taille du répertoire
ou la taille du disque par exemple dans une variable et faire une
opération
de calcul dessus.
j'arrive bien a récupérer la taille de ce dernier mais pour faire un
calcul
dessus impossible il me dit que l'opérateur est manquant.
pourquoi ?
A cause des espaces !!!


si quelqu'un peut m'aider.

voila mon script :

for /F "usebackq tokens=3 delims= " %%i IN (`dir^|find "octets libres"`)
DO
set variable=%%i
set /a operation=%variable%/1024
echo %operation%



Il suffit de mettre en "echo" les différentes commandes pour trouver
l'erreur :
(j'ai nommé le scritp "testsize.cmd")

C:vbs>testsize
C:vbs>for /F "usebackq tokens=3 delims= " %i IN (`dir |find "octets
libres"`) DO set variable=%i
C:vbs>set variable=9 505 193 984
C:vbs>set /a operation=9 505 193 984 / 1024
Opérateur manquant.
C:vbs>echo 9
9


Erreur parfaitement justifiée !
En effet, la variable représentant la taille du disque est égale (ici) à
"9 505 193 984" avec 3 espaces à l'intérieur, qui sont autant de
SÉPARATEURS !

Il faut donc supprimer ces espaces.
A PRIORI la commande suivante devrait suffire :
set variable=%variable: =%
Mais manque de bol, çà ne fait rien !

Parce qu'il y a un PIÈGE !!!
En effet, dans le résultat de DIR, les espaces que l'on voit ne sont pas des
espaces "classiques" code 32 (0x20), mais des espaces code 255 (0xFF), qui
sont affichés en ANSI sous la forme du caractère "ÿ"
Il faut donc écrire
set variable=%variable:ÿ=%
et là çà fonctionne, les espaces sont boien éliminés

MAIS le script foire toujours pour une autre raison :

C:vbs>testsize
C:vbs>for /F "usebackq tokens=3 delims= " %i IN (`dir |find "octets
libres"`) DO set variable=%i
C:vbs>set variable=9 503 096 832
C:vbs>set variable•03096832
C:vbs>set /a operation•03096832 / 1024
Nombre non valide. Les nombres sont limités à une précision de 32 bits
C:vbs>echo 9
9

!!! Le nombre est trop grand !
-> Il n'y a PAS DE SOLUTION en batch ...
(ou alors çà deviendrait une vraie usine à gaz!)


Mais c'est très simple à écrire en VBS :

"Testsize.vbs"
------------ couper ici ------------
typeD=Array("Inconnu","Amovible","Fixe","Réseau","CD-ROM","RAM Disk")
Set args = Wscript.Arguments
If args.count<1 Then wscript.quit
Disque=args(0)
Computer="."
set WMISet = GetObject("winmgmts:{impersonationLevel=impersonate}!//" &
Computer).ExecQuery _
("SELECT * FROM Win32_LogicalDisk")
Mega48576
TL="non trouvé"
For each Disk in WMISet
If StrComp(Disk.Name,Disque,vbTextCompare)=0 Then
Capa=Disk.Size
Desc=TypeD(Disk.DriveType-1)
If Capa<>"" Then
TL=int(cdbl(Disk.FreeSpace)/mega) & " Mo libres"
Else
TL="non prêt"
End If
TL=TL & " (" & Desc & ")"
exit for
end if
Next
wscript.echo "Disque " & Disque & " " & TL
------------ couper ici ------------


Et voici ce que çà donne (chez moi) :

C:vbs>testsize.vbs a:
Disque a: non trouvé

C:vbs>testsize.vbs c:
Disque c: 9062 Mo libres (Fixe)

C:vbs>testsize.vbs e:
Disque e: 0 Mo libres (CD-ROM)

C:vbs>testsize.vbs g:
Disque g: non prêt (Amovible)

C:vbs>testsize.vbs L:
Disque L: 2761 Mo libres (Réseau)



A toi de l'adapter à ton goût !

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org

Avatar
pascal leclercq
l'explication de texte est parfaite !
bravo et chapeau bas.


"pascal leclercq" a écrit dans le
message de news:
question ardue pour les administrateurs réseaux!


Préalable :
Tu as titré ton message "programmation en batch dos"
NON !
Il n'y a pas de DOS là dedans !
DOS serait bien incapable de faire ce que tu demandes ici !
"Ligne de commandes" ne signifie pas DOS !
Confondre les 2, c'est commettre une très grossière erreur de raisonnement
....
Le titre doit donc être
"programmation en batch"
(sans RIEN d'autre)

voila le problème je veux récupérer dans un script la taille du répertoire
ou la taille du disque par exemple dans une variable et faire une
opération
de calcul dessus.
j'arrive bien a récupérer la taille de ce dernier mais pour faire un
calcul
dessus impossible il me dit que l'opérateur est manquant.
pourquoi ?
A cause des espaces !!!


si quelqu'un peut m'aider.

voila mon script :

for /F "usebackq tokens=3 delims= " %%i IN (`dir^|find "octets libres"`)
DO
set variable=%%i
set /a operation=%variable%/1024
echo %operation%



Il suffit de mettre en "echo" les différentes commandes pour trouver
l'erreur :
(j'ai nommé le scritp "testsize.cmd")

C:vbs>testsize
C:vbs>for /F "usebackq tokens=3 delims= " %i IN (`dir |find "octets
libres"`) DO set variable=%i
C:vbs>set variable=9 505 193 984
C:vbs>set /a operation=9 505 193 984 / 1024
Opérateur manquant.
C:vbs>echo 9
9


Erreur parfaitement justifiée !
En effet, la variable représentant la taille du disque est égale (ici) à
"9 505 193 984" avec 3 espaces à l'intérieur, qui sont autant de
SÉPARATEURS !

Il faut donc supprimer ces espaces.
A PRIORI la commande suivante devrait suffire :
set variable=%variable: =%
Mais manque de bol, çà ne fait rien !

Parce qu'il y a un PIÈGE !!!
En effet, dans le résultat de DIR, les espaces que l'on voit ne sont pas des
espaces "classiques" code 32 (0x20), mais des espaces code 255 (0xFF), qui
sont affichés en ANSI sous la forme du caractère "ÿ"
Il faut donc écrire
set variable=%variable:ÿ=%
et là çà fonctionne, les espaces sont boien éliminés

MAIS le script foire toujours pour une autre raison :

C:vbs>testsize
C:vbs>for /F "usebackq tokens=3 delims= " %i IN (`dir |find "octets
libres"`) DO set variable=%i
C:vbs>set variable=9 503 096 832
C:vbs>set variable•03096832
C:vbs>set /a operation•03096832 / 1024
Nombre non valide. Les nombres sont limités à une précision de 32 bits
C:vbs>echo 9
9

!!! Le nombre est trop grand !
-> Il n'y a PAS DE SOLUTION en batch ...
(ou alors çà deviendrait une vraie usine à gaz!)


Mais c'est très simple à écrire en VBS :

"Testsize.vbs"
------------ couper ici ------------
typeD=Array("Inconnu","Amovible","Fixe","Réseau","CD-ROM","RAM Disk")
Set args = Wscript.Arguments
If args.count<1 Then wscript.quit
Disque=args(0)
Computer="."
set WMISet = GetObject("winmgmts:{impersonationLevel=impersonate}!//" &
Computer).ExecQuery _
("SELECT * FROM Win32_LogicalDisk")
Mega48576
TL="non trouvé"
For each Disk in WMISet
If StrComp(Disk.Name,Disque,vbTextCompare)=0 Then
Capa=Disk.Size
Desc=TypeD(Disk.DriveType-1)
If Capa<>"" Then
TL=int(cdbl(Disk.FreeSpace)/mega) & " Mo libres"
Else
TL="non prêt"
End If
TL=TL & " (" & Desc & ")"
exit for
end if
Next
wscript.echo "Disque " & Disque & " " & TL
------------ couper ici ------------


Et voici ce que çà donne (chez moi) :

C:vbs>testsize.vbs a:
Disque a: non trouvé

C:vbs>testsize.vbs c:
Disque c: 9062 Mo libres (Fixe)

C:vbs>testsize.vbs e:
Disque e: 0 Mo libres (CD-ROM)

C:vbs>testsize.vbs g:
Disque g: non prêt (Amovible)

C:vbs>testsize.vbs L:
Disque L: 2761 Mo libres (Réseau)



A toi de l'adapter à ton goût !

--
May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP] - http://www.bellamyjc.org