Comparer taille dun dossier à intervalle de temps Powershell

Adlp -  
choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   -
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. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    Bonjour

    $Size et $Size1 correspondent à quoi ? Quel est le type des variables ? Des objets ? des integers ? des valeurs ?
    1
  2. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    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
    1. Adlp
       
      Ok merci beaucoup, j'essaye de faire comme tu m'as dit
      0
      1. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113 > Adlp
         
        pas de soucis, n'hésite pas à revenir...
        1
      2. Adlp > choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention  
         
        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
  3. Adlp
     
    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
  4. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    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
    1. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113
       
      du coup, pas besoin du Compare-Object
      0
      1. Adlp > choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention  
         
        D'accord merci,

        utiliser -match -notmatch pour voir si les 2 tailles sont égales peut-être une bonne solution ?
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    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
    1. Adlp
       
      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
  7. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    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
  8. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    sinon, tester la condition avec d'autres possibilités...
    0
    1. Adlp
       
      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
  9. choubaka Messages postés 5534 Date d'inscription   Statut Modérateur Dernière intervention   2 113
     
    pas de soucis
    0