Question Extraction de donnée de Get-DirStats
- COTTIN
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 84
- Remerciements reçus 0
il y a 5 ans 11 mois #27738
par COTTIN
Extraction de donnée de Get-DirStats a été créé par COTTIN
Bonjour,
Je pense que vous connaissez le script get-dirstats qui permet de faire une extraction de dossier + taille + nombre de fichier d'un emplacement donnée.
J'aimerais une petite précision si je peux me permettre, Lors de l'extraction de la taille des dossiers, j'aimerais convertir cette donnée en GB, car pour le moment elle est seulement en Octet.
Voici ma ligne de commande :
[code:1].\Get-DirStats.ps1 -Path D:\Projets -FormatNumbers -Total | Export-Csv D:\test.csv -Encoding utf8 -Delimiter \";\" -NoTypeInformation[/code:1]
voici le script :
[code:1]# Get-DirStats.ps1
# Written by Bill Stewart (Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.)
# Outputs file system directory statistics.
#requires -version 2
<#
.SYNOPSIS
Outputs file system directory statistics.
.DESCRIPTION
Outputs file system directory statistics (number of files and the sum of all file sizes) for one or more directories.
.PARAMETER Path
Specifies a path to one or more file system directories. Wildcards are not permitted. The default path is the current directory (.).
.PARAMETER LiteralPath
Specifies a path to one or more file system directories. Unlike Path, the value of LiteralPath is used exactly as it is typed.
.PARAMETER Only
Outputs statistics for a directory but not any of its subdirectories.
.PARAMETER Every
Outputs statistics for every directory in the specified path instead of only the first level of directories.
.PARAMETER FormatNumbers
Formats numbers in the output object to include thousands separators.
.PARAMETER Total
Outputs a summary object after all other output that sums all statistics.
#>
[CmdletBinding(DefaultParameterSetName=\"Path\"«»)]
param(
[parameter(Position=0,Mandatory=$false,ParameterSetName=\"Path\",ValueFromPipeline=$true)]
$Path=(get-location).Path,
[parameter(Position=0,Mandatory=$true,ParameterSetName=\"LiteralPath\"«»)]
[String[]] $LiteralPath,
[Switch] $Only,
[Switch] $Every,
[Switch] $FormatNumbers,
[Switch] $Total
)
begin {
$ParamSetName = $PSCmdlet.ParameterSetName
if ( $ParamSetName -eq \"Path\" ) {
$PipelineInput = ( -not $PSBoundParameters.ContainsKey(\"Path\"«») ) -and ( -not $Path )
}
elseif ( $ParamSetName -eq \"LiteralPath\" ) {
$PipelineInput = $false
}
# Script-level variables used with -Total.
[UInt64] $script:totalcount = 0
[UInt64] $script:totalbytes = 0
# Returns a [System.IO.DirectoryInfo] object if it exists.
function Get-Directory {
param( $item )
if ( $ParamSetName -eq \"Path\" ) {
if ( Test-Path -Path $item -PathType Container ) {
$item = Get-Item -Path $item -Force
}
}
elseif ( $ParamSetName -eq \"LiteralPath\" ) {
if ( Test-Path -LiteralPath $item -PathType Container ) {
$item = Get-Item -LiteralPath $item -Force
}
}
if ( $item -and ($item -is [System.IO.DirectoryInfo]) ) {
return $item
}
}
# Filter that outputs the custom object with formatted numbers.
function Format-Output {
process {
$_ | Select-Object Path,
@{Name=\"Files\"; Expression={\"{0:N0}\" -f $_.Files}},
@{Name=\"Size\"; Expression={\"{0:N0}\" -f $_.Size}}
}
}
# Outputs directory statistics for the specified directory. With -recurse,
# the function includes files in all subdirectories of the specified
# directory. With -format, numbers in the output objects are formatted with
# the Format-Output filter.
function Get-DirectoryStats {
param( $directory, $recurse, $format )
Write-Progress -Activity \"Get-DirStats.ps1\" -Status \"Reading '$($directory.FullName)'\"
$files = $directory | Get-ChildItem -Force -Recurse:$recurse | Where-Object { -not $_.PSIsContainer }
if ( $files ) {
Write-Progress -Activity \"Get-DirStats.ps1\" -Status \"Calculating '$($directory.FullName)'\"
$output = $files | Measure-Object -Sum -Property Length | Select-Object `
@{Name=\"Path\"; Expression={$directory.FullName}},
@{Name=\"Files\"; Expression={$_.Count; $script:totalcount += $_.Count}},
@{Name=\"Size\"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}
}
else {
$output = \"\" | Select-Object `
@{Name=\"Path\"; Expression={$directory.FullName}},
@{Name=\"Files\"; Expression={0}},
@{Name=\"Size\"; Expression={0}}
}
if ( -not $format ) { $output } else { $output | Format-Output }
}
}
process {
# Get the item to process, no matter whether the input comes from the
# pipeline or not.
if ( $PipelineInput ) {
$item = $_
}
else {
if ( $ParamSetName -eq \"Path\" ) {
$item = $Path
}
elseif ( $ParamSetName -eq \"LiteralPath\" ) {
$item = $LiteralPath
}
}
# Write an error if the item is not a directory in the file system.
$directory = Get-Directory -item $item
if ( -not $directory ) {
Write-Error -Message \"Path '$item' is not a directory in the file system.\" -Category InvalidType
return
}
# Get the statistics for the first-level directory.
Get-DirectoryStats -directory $directory -recurse:$false -format:$FormatNumbers
# -Only means no further processing past the first-level directory.
if ( $Only ) { return }
# Get the subdirectories of the first-level directory and get the statistics
# for each of them.
$directory | Get-ChildItem -Force -Recurse:$Every |
Where-Object { $_.PSIsContainer } | ForEach-Object {
Get-DirectoryStats -directory $_ -recurse:«»(-not $Every) -format:$FormatNumbers
}
}
end {
# If -Total specified, output summary object.
if ( $Total ) {
$output = \"\" | Select-Object `
@{Name=\"Path\"; Expression={\"<Total>\"}},
@{Name=\"Files\"; Expression={$script:totalcount}},
@{Name=\"Size\"; Expression={$script:totalbytes}}
if ( -not $FormatNumbers ) { $output } else { $output | Format-Output }
}
}
[/code:1]
Merci de votre futur aide
Bonne soirée à vous
Je pense que vous connaissez le script get-dirstats qui permet de faire une extraction de dossier + taille + nombre de fichier d'un emplacement donnée.
J'aimerais une petite précision si je peux me permettre, Lors de l'extraction de la taille des dossiers, j'aimerais convertir cette donnée en GB, car pour le moment elle est seulement en Octet.
Voici ma ligne de commande :
[code:1].\Get-DirStats.ps1 -Path D:\Projets -FormatNumbers -Total | Export-Csv D:\test.csv -Encoding utf8 -Delimiter \";\" -NoTypeInformation[/code:1]
voici le script :
[code:1]# Get-DirStats.ps1
# Written by Bill Stewart (Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.)
# Outputs file system directory statistics.
#requires -version 2
<#
.SYNOPSIS
Outputs file system directory statistics.
.DESCRIPTION
Outputs file system directory statistics (number of files and the sum of all file sizes) for one or more directories.
.PARAMETER Path
Specifies a path to one or more file system directories. Wildcards are not permitted. The default path is the current directory (.).
.PARAMETER LiteralPath
Specifies a path to one or more file system directories. Unlike Path, the value of LiteralPath is used exactly as it is typed.
.PARAMETER Only
Outputs statistics for a directory but not any of its subdirectories.
.PARAMETER Every
Outputs statistics for every directory in the specified path instead of only the first level of directories.
.PARAMETER FormatNumbers
Formats numbers in the output object to include thousands separators.
.PARAMETER Total
Outputs a summary object after all other output that sums all statistics.
#>
[CmdletBinding(DefaultParameterSetName=\"Path\"«»)]
param(
[parameter(Position=0,Mandatory=$false,ParameterSetName=\"Path\",ValueFromPipeline=$true)]
$Path=(get-location).Path,
[parameter(Position=0,Mandatory=$true,ParameterSetName=\"LiteralPath\"«»)]
[String[]] $LiteralPath,
[Switch] $Only,
[Switch] $Every,
[Switch] $FormatNumbers,
[Switch] $Total
)
begin {
$ParamSetName = $PSCmdlet.ParameterSetName
if ( $ParamSetName -eq \"Path\" ) {
$PipelineInput = ( -not $PSBoundParameters.ContainsKey(\"Path\"«») ) -and ( -not $Path )
}
elseif ( $ParamSetName -eq \"LiteralPath\" ) {
$PipelineInput = $false
}
# Script-level variables used with -Total.
[UInt64] $script:totalcount = 0
[UInt64] $script:totalbytes = 0
# Returns a [System.IO.DirectoryInfo] object if it exists.
function Get-Directory {
param( $item )
if ( $ParamSetName -eq \"Path\" ) {
if ( Test-Path -Path $item -PathType Container ) {
$item = Get-Item -Path $item -Force
}
}
elseif ( $ParamSetName -eq \"LiteralPath\" ) {
if ( Test-Path -LiteralPath $item -PathType Container ) {
$item = Get-Item -LiteralPath $item -Force
}
}
if ( $item -and ($item -is [System.IO.DirectoryInfo]) ) {
return $item
}
}
# Filter that outputs the custom object with formatted numbers.
function Format-Output {
process {
$_ | Select-Object Path,
@{Name=\"Files\"; Expression={\"{0:N0}\" -f $_.Files}},
@{Name=\"Size\"; Expression={\"{0:N0}\" -f $_.Size}}
}
}
# Outputs directory statistics for the specified directory. With -recurse,
# the function includes files in all subdirectories of the specified
# directory. With -format, numbers in the output objects are formatted with
# the Format-Output filter.
function Get-DirectoryStats {
param( $directory, $recurse, $format )
Write-Progress -Activity \"Get-DirStats.ps1\" -Status \"Reading '$($directory.FullName)'\"
$files = $directory | Get-ChildItem -Force -Recurse:$recurse | Where-Object { -not $_.PSIsContainer }
if ( $files ) {
Write-Progress -Activity \"Get-DirStats.ps1\" -Status \"Calculating '$($directory.FullName)'\"
$output = $files | Measure-Object -Sum -Property Length | Select-Object `
@{Name=\"Path\"; Expression={$directory.FullName}},
@{Name=\"Files\"; Expression={$_.Count; $script:totalcount += $_.Count}},
@{Name=\"Size\"; Expression={$_.Sum; $script:totalbytes += $_.Sum}}
}
else {
$output = \"\" | Select-Object `
@{Name=\"Path\"; Expression={$directory.FullName}},
@{Name=\"Files\"; Expression={0}},
@{Name=\"Size\"; Expression={0}}
}
if ( -not $format ) { $output } else { $output | Format-Output }
}
}
process {
# Get the item to process, no matter whether the input comes from the
# pipeline or not.
if ( $PipelineInput ) {
$item = $_
}
else {
if ( $ParamSetName -eq \"Path\" ) {
$item = $Path
}
elseif ( $ParamSetName -eq \"LiteralPath\" ) {
$item = $LiteralPath
}
}
# Write an error if the item is not a directory in the file system.
$directory = Get-Directory -item $item
if ( -not $directory ) {
Write-Error -Message \"Path '$item' is not a directory in the file system.\" -Category InvalidType
return
}
# Get the statistics for the first-level directory.
Get-DirectoryStats -directory $directory -recurse:$false -format:$FormatNumbers
# -Only means no further processing past the first-level directory.
if ( $Only ) { return }
# Get the subdirectories of the first-level directory and get the statistics
# for each of them.
$directory | Get-ChildItem -Force -Recurse:$Every |
Where-Object { $_.PSIsContainer } | ForEach-Object {
Get-DirectoryStats -directory $_ -recurse:«»(-not $Every) -format:$FormatNumbers
}
}
end {
# If -Total specified, output summary object.
if ( $Total ) {
$output = \"\" | Select-Object `
@{Name=\"Path\"; Expression={\"<Total>\"}},
@{Name=\"Files\"; Expression={$script:totalcount}},
@{Name=\"Size\"; Expression={$script:totalbytes}}
if ( -not $FormatNumbers ) { $output } else { $output | Format-Output }
}
}
[/code:1]
Merci de votre futur aide
Bonne soirée à vous
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 5 ans 11 mois #27742
par Philippe
Réponse de Philippe sur le sujet Re:Extraction de donnée de Get-DirStats
salut tcottin
pour avoir l'affichage en Go il faut divisé le resultat par 1024*1024*1024 ou en plus simple /1GB
il faut aussi que le formats des nombres soit utilisable pour la division, c'est pour ça que j'ai enlevé l'option \"-FormatNumbers\"
[code:1].\Get-DirStats.ps1 -Path i:\temp -Total | select path, files, @{e={$_.size/1GB};n=\"Size(Go)\"} | Export-Csv D:\test.csv -Encoding utf8 -Delimiter \";\" -NoTypeInformation[/code:1]
tu peux rajouter aussi un arrondie, ici à 4 chiffres apres la virgule :
[code:1].\Get-DirStats.ps1 -Path i:\temp -Total | select path, files, @{e={[math]::round($_.size/1GB,4)};n=\"Size(Go)\"} | Export-Csv D:\test.csv -Encoding utf8 -Delimiter \";\" -NoTypeInformation
[/code:1]<br><br>Message édité par: 6ratgus, à: 9/11/18 11:21
pour avoir l'affichage en Go il faut divisé le resultat par 1024*1024*1024 ou en plus simple /1GB
il faut aussi que le formats des nombres soit utilisable pour la division, c'est pour ça que j'ai enlevé l'option \"-FormatNumbers\"
[code:1].\Get-DirStats.ps1 -Path i:\temp -Total | select path, files, @{e={$_.size/1GB};n=\"Size(Go)\"} | Export-Csv D:\test.csv -Encoding utf8 -Delimiter \";\" -NoTypeInformation[/code:1]
tu peux rajouter aussi un arrondie, ici à 4 chiffres apres la virgule :
[code:1].\Get-DirStats.ps1 -Path i:\temp -Total | select path, files, @{e={[math]::round($_.size/1GB,4)};n=\"Size(Go)\"} | Export-Csv D:\test.csv -Encoding utf8 -Delimiter \";\" -NoTypeInformation
[/code:1]<br><br>Message édité par: 6ratgus, à: 9/11/18 11:21
Connexion ou Créer un compte pour participer à la conversation.
- COTTIN
- Auteur du sujet
- Hors Ligne
- Membre premium
Réduire
Plus d'informations
- Messages : 84
- Remerciements reçus 0
il y a 5 ans 11 mois #27743
par COTTIN
Réponse de COTTIN sur le sujet Re:Extraction de donnée de Get-DirStats
Merci !!! C'est parfait !
Je me prennais la tête depuis ce matin pour comprendre, je tentais de modifier dans le script, mais je suis pas encore une très grand expert de powershell.
Merci de votre aide, mes compétences augmente encore avec votre Select
Merci, et bonne journée et bon week end.
Je me prennais la tête depuis ce matin pour comprendre, je tentais de modifier dans le script, mais je suis pas encore une très grand expert de powershell.
Merci de votre aide, mes compétences augmente encore avec votre Select
Merci, et bonne journée et bon week end.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.108 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les initiés
- Extraction de donnée de Get-DirStats