IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Scripts/Batch Discussion :

Récupération taille sur le disque d'un répertoire [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Par défaut Récupération taille sur le disque d'un répertoire
    Bonjour,

    Je fait appel à vous pour l'aide de l'écriture d'un script qui permettra de connaître la taille sur le disque d'un répertoire.
    J'ai trouvé plusieurs solutions mais n 'arrive à récupérer l'information souhaité.

    Lorsque je clic droit sur un répertoire, il se peut que la taille et taille sur le disque soient différentes :

    Nom : TailleDirectory.png
Affichages : 617
Taille : 19,1 Ko

    Nous pouvons voir qu'il y a une légère différence.

    La commande du script que j'ai écrit récupère la première valeur (=> 144 Mo) alors que je souhaiterai récupérer la seconde (=> 146 Mo)

    Voici le script :

    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
        # VARIABLES ====================================================================
     
        #Directory a checker
        $DirCheck = $args[0]
        #Warning value
        $WarningValue = $args[1]
        #Critical value
        $CriticalValue = $args[2]
        #Unite de recherche
        $ValUnit = $args[3]
        $Calc = "1$ValUnit"
     
     
    # Verification des seuils
    if(!($WarningValue -match "^\d+$")){
      if(!($CriticalValue -match "^\d+$")){
        write-host " Les seuils doivent etre numeric !!!"
        exit 3
      }else{
        write-host " Le seuil Warning doit etre numeric !!!"
        exit 3
      }
    }
    if(!($CriticalValue -match "^\d+$")){
       write-host " Le seuil Critical doit etre numeric !!!"
       exit 3
    }
    if($WarningValue -gt $CriticalValue) {
      write-host "[UNKNOWN] Le Seuil warning doit etre inferieur au seuil Critical  !!!"
      exit 3
    }
     
       if(!(Test-Path $DirCheck -PathType Container)) { 
          write-host "[UNKNOWN] Directory non accessible !!!"
          exit 3
       } else {
    	$Val = ((Get-ChildItem $DirCheck -Recurse -ErrorAction SilentlyContinue -ErrorVariable err | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum / $Calc)
        foreach ($errorRecord in $err)
           {
              if ($errorRecord.Exception -is [System.IO.PathTooLongException])
              {
                 Write-Output "Path too long in directory on '$($errorRecord.TargetObject)'."
                 exit 3
              }
              elseIf ($errorRecord.Exception -is [System.UnauthorizedAccessException])
              {
                 Write-Output "Directory '$($errorRecord.TargetObject)' non accessible avec ce user !!!"
                 exit 3
              }
              else
              {
                 Write-Output -ErrorRecord $errorRecord
                 exit 3
              }
           }
     
          $Msg = "{0:N2}" -f $Val
          if ($Val -gt $CriticalValue){
             Write-Host "[CRITICAL] Directory $DirCheck =  $Msg $ValUnit  > $CriticalValue $ValUnit | Directory=$Msg$ValUnit;$WarningValue;$CriticalValue"
             exit 2
          }elseif ($Val -gt $WarningValue){
             Write-Host "[WARNING] Directory $DirCheck = $Msg $ValUnit > $WarningValue $ValUnit | Directory=$Msg$ValUnit;$WarningValue;$CriticalValue"
             exit 1
          }else{
             Write-Host "[OK] Directory $DirCheck = $Msg $ValUnit | Directory=$Msg$ValUnit;$WarningValue;$CriticalValue"
             exit 0
          }
       }


    Voici le résultat obtenu :

    PS F:\Scripts\Nagios> ./Check_Folder.ps1 "C:\Users\Fabio\Documents" 100 150 MB
    [WARNING] Directory C:\Users\Fabio\Documents = 144,21 MB > 100 MB | Directory=144,21MB;100;150
    Est-ce qu'il existe un paramètre ou peut-être une autre commande qui pourrait me retourner la valeur souhaité ?

    Merci d'avance de votre aide

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    Question intéressante.
    Voici comment ajouter une propriété GetFileSizeOnDisk sur tes objets FileInfo retournés par Get-ChildItem (par exemple)

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Add-Type -type  @'
    using System;
    using System.Runtime.InteropServices;
    using System.ComponentModel;
    using System.IO;
     
    namespace Win32Functions
    {
        public static class ExtendedFileInfo
        {
            public static long GetFileSizeOnDisk(this FileInfo info)
            {
                uint dummy, sectorsPerCluster, bytesPerSector;
                int result = GetDiskFreeSpaceW(info.Directory.Root.FullName, out sectorsPerCluster, out bytesPerSector, out dummy, out dummy);
                if (result == 0) throw new Win32Exception();
                uint clusterSize = sectorsPerCluster * bytesPerSector;
                uint hosize;
                uint losize = GetCompressedFileSizeW(info.FullName, out hosize);
                long size;
                size = (long)hosize << 32 | losize;
                return ((size + clusterSize - 1) / clusterSize) * clusterSize;
            }
     
            [DllImport("kernel32.dll")]
            static extern uint GetCompressedFileSizeW([In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
               [Out, MarshalAs(UnmanagedType.U4)] out uint lpFileSizeHigh);
     
            [DllImport("kernel32.dll", SetLastError = true, PreserveSig = true)]
            static extern int GetDiskFreeSpaceW([In, MarshalAs(UnmanagedType.LPWStr)] string lpRootPathName,
               out uint lpSectorsPerCluster, out uint lpBytesPerSector, out uint lpNumberOfFreeClusters,
               out uint lpTotalNumberOfClusters);
        }
     
    }
    '@ 
    Update-TypeData -TypeName "System.IO.FileInfo" -MemberType ScriptProperty -MemberName "GetFileSizeOnDisk" -Value {[Win32Functions.ExtendedFileInfo]::GetFileSizeOnDisk($this)} -Force


    Utilisation
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    Get-ChildItem | Select-Object FullName, Length, GetFileSizeOnDisk

  3. #3
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Février 2016
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Février 2016
    Messages : 21
    Par défaut
    Et bien je te dis un grand merci ericlm128.

    Je viens d'appliquer ton code et tous fonctionne parfaitement ^^

    Je clos la discussion

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Taille sur le disque d'un dossier
    Par cd090580 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 16/11/2009, 14h43
  2. Substituer le CDROM à un répertoire sur le Disque DUR ?
    Par erratum dans le forum Assembleur
    Réponses: 3
    Dernier message: 13/04/2006, 12h22
  3. Effacer un répertoire sur un disque
    Par sfaxi dans le forum Oracle
    Réponses: 1
    Dernier message: 23/11/2005, 12h14
  4. Réponses: 7
    Dernier message: 08/06/2005, 11h04
  5. Infos sur la taille d'un disque
    Par Mille sabords dans le forum Windows
    Réponses: 4
    Dernier message: 10/03/2005, 09h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo