Comparer taille dun dossier à intervalle de temps Powershell

Fermé
Adlp - 15 mars 2022 à 11:37
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 - 15 mars 2022 à 18:00
Bonjour,

je suis débutant en Powershell, j'aimerais dans mon script comparer la taille d'un ensemble de sous-dossier d'un répertoire avec leur taille 30 secondes plus tard (pour voir si ceux--ci grossit pendant l’exécution du script)

Pour cela j'ai tout d'abord calculer la taille des sous dossier du répertoire :
$path = "C:\temp"

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach{

$FolderSize = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb
}


puis je laisse en pause le script :

Start-Sleep -Seconds 30

puis je calcul de nouveau la taille du répertoire de la même manière

Et je souhaites donc ensuite comparer la taille avant la pause et la taille après la pause.

Pour cela j'ai essayé la commande Compare-Object

Compare-Object -ReferenceObject $Size -DifferenceObject $Size1

mais je n'ai aucun résultat

Quelqu'un saurait me dire si compare-object est la bonne commande pour mon cas ? Ou si il y a un meilleur moyen pour parvenir au résultat souhaité ?

Merci par avance

8 réponses

choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
15 mars 2022 à 12:20
Bonjour

$Size et $Size1 correspondent à quoi ? Quel est le type des variables ? Des objets ? des integers ? des valeurs ?
1
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
Modifié le 15 mars 2022 à 13:03
non, utilise les comparaisons pour des valeurs numériques et caractères, chaînes de caratères

match et notmatch sont pour les strings ou caractères

  -eq  equals
 -ne  not equals
 -gt  greater than
 -ge  greater than or equal
 -lt  less than
 -le  less than or equal


exemple

2 -eq 2                 # Output: True
2 -eq 3                 # Output: False


1
Ok merci beaucoup, j'essaye de faire comme tu m'as dit
0
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101 > Adlp
15 mars 2022 à 13:10
pas de soucis, n'hésite pas à revenir...
1
Adlp > choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024
Modifié le 15 mars 2022 à 14:12
Je reviens vers toi j'ai essayé

(Get-ChildItem "C:\TEMP\" -Recurse | Measure-Object -Property Length -Sum).Sum / 1Mb


Cela donne une somme de la taille du dossier C:\TEMP\

moi j'ai besoin du détail de chaque taille des sous dossier du répertoire (1er niveau de sous dossier uniquement)

j'ai donc essayé ceci

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach{

$FolderSize = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

($FolderSize)

}


Ceci me liste bien la taille de chaque sous dossier

Je fais donc ensuite la pause

Start-Sleep -Seconds 30
write-host( "fin de la pause")


calcul de nouveau la taille

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach{

$FolderSize1 = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

($FolderSize1)

}


J'ai ensuite essayé

$FolderSize -eq $FolderSize1 


Dans la console cela me donne :

6,4296875
6,4296875
7,783203125
fin de la pause
12,859375
6,4296875
7,783203125
True

J'aimerais qu'il y ai False pour le sous-dossier qui passe de "6,4296875" à "12,859375" et True pour les autres qui n'ont pas grossit

J'espère que mes explications sont assez claire..
0
Je me suis trompé de variable dans mon post pour le compare-object c'est plutôt

Compare-Object -ReferenceObject $FolderSize -DifferenceObject $FolderSize1

$FolderSize et $FolderSize1 donnent la taille du sous-dossier en Kb ce sont donc j'imagine des integers
0
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
Modifié le 15 mars 2022 à 12:32
Pour inclure les sous-dossiers ...

(Get-ChildItem "C:\TEMP\" -Recurse | Measure-Object -Property Length -Sum).Sum / 1Mb


Tu obtiens une valeur à X décimales, dans cas ici en Mb.. mais, c'est idem en Kb saux qu'il n'y aura pas décimales...

tu peux également arrondir à trois décimales si tu le fais en Mb..

[math]::Round((Get-ChildItem "C:\TEMP\" -Recurse | Measure-Object -Property Length -Sum).Sum / 1Mb,3)


Il te suffit donc de créer une variable de début et une variable après 30 secondes.. de faire la différence entre les deux, donc une variable pour ça aussi.
Si tu effectues le calcul toutes les trentes secondes .. prévoir de réiniatiliser la variable de début ou de prévoir une variable intermédiaire.



0
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
15 mars 2022 à 12:35
du coup, pas besoin du Compare-Object
0
Adlp > choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024
15 mars 2022 à 12:56
D'accord merci,

utiliser -match -notmatch pour voir si les 2 tailles sont égales peut-être une bonne solution ?
0

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

Posez votre question
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
15 mars 2022 à 14:21
il te suffit d'utiliser la condition "if" avec la comparaison -eq et /ou -gt à la fin de chaque bloc de code ou d'écrire une fonction qui l'exécute que tu appelles au bon moment....

Si c'est égal, tu renvoie "true", sinon si c'est plus grand "false" .. il n'y a que deux conditions donc un simple "if" suffit...

exemple

Function Test-FolderSize{

param (
        $FolderSize
       $FolderSize1



if ( $FolderSize -eq $FolderSize1 )
{
    Write-Output $True
}

Else{ Write-Output $False}

}

0
Merci, je sens que je touche au but mais les résultats de la condition if sont pas logique..

1er essai :

$path = "C:\TEMP"

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach{

$FolderSize = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

($FolderSize)

}

Start-Sleep -Seconds 30
write-host( "fin de la pause")

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach{

$FolderSize1 = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

($FolderSize1)

if ( $FolderSize -eq $FolderSize1 )
{
Write-Output $True
}

Else
{
Write-Output $False
}

}


Ma console :

6,4296875
6,4296875
7,783203125
fin de la pause
6,4296875
False
6,4296875
False
7,783203125
True

La taille des dossiers de "6,4296875" ne bouge pas avant et après la pause, malgré cela j'ai "False" de retourné.

2ème essai :

$path = "C:\TEMP"

Function Test-FolderSize{

param (
$FolderSize,
$FolderSize1)



if ( $FolderSize -eq $FolderSize1 )
{
Write-Output $True
}

Else{ Write-Output $False}

}

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach{

$FolderSize = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

($FolderSize)

}

Start-Sleep -Seconds 20
write-host( "fin de la pause")

Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach{

$FolderSize1 = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

($FolderSize1)

(Test-FolderSize)


}


Ma console :

6,4296875
6,4296875
7,783203125
fin de la pause
12,859375
True
6,4296875
True
7,783203125
True

La taille du 1er dossier change 6,4296875 => 12,859375 pourtant ça me renvoie True...
0
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
Modifié le 15 mars 2022 à 16:00
essaye en foçant le type de variables ...

[decimal] ou [long]

param (
       [long]  $FolderSize,
       [long] $FolderSize1)


petit truc en powershell, lorsque tu fais appel à un "Get" .. prends l'habitude de l'associer à une variable.

ex:

$FolderToTest = Get-ChildItem -Force $path -ErrorAction SilentlyContinue -Directory | foreach{
     
$FolderSize = (Get-ChildItem $_.fullname -Recurse -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum/ 1Kb

($FolderSize)

}


Ce qui économise pas mal de lignes de codes et rend ton script plus lisible .. n'hésite pas à mettre des commentaires pour expliquer ce que tu fais.

# Ici je mets mon commentaire, ce ne sera pas exécuté








0
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
15 mars 2022 à 16:17
sinon, tester la condition avec d'autres possibilités...
0
Désolé j'ai été pris par autre chose au boulot. Je dois me sauver je regarde ça demain. merci encore pour ton aide précieuse !
0
choubaka Messages postés 39376 Date d'inscription jeudi 4 avril 2002 Statut Modérateur Dernière intervention 29 avril 2024 2 101
15 mars 2022 à 18:00
pas de soucis
0