Flash info

Une frénésie incontrollée poussent certains individus à convertir tous les scripts d'admin en PowerShell. L'un d'eux aurait été apperçu récemment près du campus universitaire de Talence.

 
Accueil arrow Bibliothèque de scripts arrow Fichiers et disques arrow Mettez une barre de progression dans vos copies
Mettez une barre de progression dans vos copies
Écrit par Arnaud Petitjean [MVP]   
26-11-2012
progressbarappercu.jpg 

Les barres de progressions sont souvent négligées des scripteurs, et ce en général par manque de temps mais peut-être aussi par méconnaissance.

Elles sont pourtant très simples à mettre en oeuvre, dès lors que l'on sait calculer un pourcentage.

Voici donc l'occasion de perfectionner vos connaissances à travers un petit script très utile de recopie de fichiers et répertoires.

L'avantage d'une barre de progression est que lorsque le script est lancé dans la console PowerShell "classique", elle s'affiche sous forme texte:

   progressbar1.jpg

Et que lorsque le script est lancée dans l'éditeur graphique ISE, celle-ci se transforme en barre de progression graphique, comme ci-dessous:

   progressbar2.jpg

Script:

function Copy-ItemWithProgressBar
{
<#
.Notes
AUTHOR:   Arnaud Petitjean
VERSION:  1.0
CREATED:  11/26/2012
LASTEDIT:

.Synopsis
Copie un répertoire ainsi que ses objets enfants d'un emplacement à un autre en affichant une barre de progression.

.Description
La copie des objets s'effectue de façon récursive. Si le répertoire de destination n'existe pas, il sera créé automatiquement.

.Parameter Source
Spécifie le chemin d'accès de l'objet à copier. Il s'agit généralement d'un répertoire.

.Parameter Destination
Spécifie le chemin d'accès de l'emplacement où les éléments doivent être copiés.

.Example
PS > Copy-ItemWithProgressBar -Source C:\temp\monDossier -Destination D:\

Copie le répertoire C:\temp\monDossier ainsi que son contenu vers D:\ en affichant une barre de progression.

    .Example
PS > Copy-ItemWithProgressBar -Source .\monDossier -Destination D:\temp

Copie le répertoire "monDossier" à partir du chemin courant ainsi que son contenu vers D:\temp en affichant une barre de progression.
#>
[cmdletBinding()]
Param (
[parameter(Mandatory=$true, ValueFromPipeline=$true)]
$Source,
[parameter(Mandatory=$true, ValueFromPipeline=$false)]
$Destination
)

begin
{
$numberofitems = @(Get-ChildItem $Source).count
$cpt = 0
$Source = Get-Item -Path $Source
}

process
{
if ($Source.PSIsContainer)
{
foreach ($item in (Get-ChildItem $Source))
{
if (!(Test-Path $Destination))
{
New-Item -Path $Destination -ItemType Directory | Out-Null
}
if ($item.PSIsContainer)
{
Copy-ItemWithProgressBar -Source $item.FullName `
-Destination (Join-Path $Destination $item.Name)
}
else
{
$cpt++
Copy-Item -Path $item.Fullname -Destination $Destination
Write-Progress -Id 1 `                                    -Activity ("Copie du répertoire {0}" -f $Source) `
-PercentComplete ($cpt / $numberofitems * 100) `
-Status ("Copie du fichier {0} - {1} sur {2}" -f $item.Name, $cpt, $numberofitems)
}
}

}
}

Dernière mise à jour : ( 26-11-2012 )
 
© 2017 PowerShell-Scripting.com