Comparer taille dun dossier à intervalle de temps Powershell

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

  1. Modérateur
    Bonjour

    $Size et $Size1 correspondent à quoi ? Quel est le type des variables ? Des objets ? des integers ? des valeurs ?
    1. Modérateur
      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
      2. Modérateur
        @Adlppas de soucis, n'hésite pas à revenir...
      3. @choubakaJe 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..
    2. 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
      1. Modérateur
        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.

        1. Modérateur
          du coup, pas besoin du Compare-Object
        2. @choubakaD'accord merci,

          utiliser -match -notmatch pour voir si les 2 tailles sont égales peut-être une bonne solution ?
      2. Modérateur
        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}
        
        }

        1. 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...
      3. Modérateur
        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é


        1. Modérateur
          sinon, tester la condition avec d'autres possibilités...
          1. 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 !