J'ai modifié le code de stej (qui était génial, juste ce dont j'avais besoin !) pour utiliser un tampon plus grand, [long] pour les fichiers plus grands et j'ai utilisé la classe System.Diagnostics.Stopwatch pour suivre le temps écoulé et estimer le temps restant.
Nous avons également ajouté le signalement du taux de transfert pendant le transfert et la sortie du temps écoulé global et du taux de transfert global.
Utilisation d'une mémoire tampon de 4 Mo (4096*1024 octets) pour obtenir un débit supérieur au débit natif de Win7 en copiant du NAS vers une clé USB sur un ordinateur portable en wifi.
Sur la liste des choses à faire :
- ajouter la gestion des erreurs (catch)
- traiter la liste du fichier get-childitem comme entrée
- barres de progression imbriquées lors de la copie de plusieurs fichiers (fichier x de y, % si données totales copiées, etc.)
- paramètre d'entrée pour la taille du tampon
N'hésitez pas à utiliser/améliorer :-)
function Copy-File {
param( [string]$from, [string]$to)
$ffile = [io.file]::OpenRead($from)
$tofile = [io.file]::OpenWrite($to)
Write-Progress `
-Activity "Copying file" `
-status ($from.Split("\")|select -last 1) `
-PercentComplete 0
try {
$sw = [System.Diagnostics.Stopwatch]::StartNew();
[byte[]]$buff = new-object byte[] (4096*1024)
[long]$total = [long]$count = 0
do {
$count = $ffile.Read($buff, 0, $buff.Length)
$tofile.Write($buff, 0, $count)
$total += $count
[int]$pctcomp = ([int]($total/$ffile.Length* 100));
[int]$secselapsed = [int]($sw.elapsedmilliseconds.ToString())/1000;
if ( $secselapsed -ne 0 ) {
[single]$xferrate = (($total/$secselapsed)/1mb);
} else {
[single]$xferrate = 0.0
}
if ($total % 1mb -eq 0) {
if($pctcomp -gt 0)`
{[int]$secsleft = ((($secselapsed/$pctcomp)* 100)-$secselapsed);
} else {
[int]$secsleft = 0};
Write-Progress `
-Activity ($pctcomp.ToString() + "% Copying file @ " + "{0:n2}" -f $xferrate + " MB/s")`
-status ($from.Split("\")|select -last 1) `
-PercentComplete $pctcomp `
-SecondsRemaining $secsleft;
}
} while ($count -gt 0)
$sw.Stop();
$sw.Reset();
}
finally {
write-host (($from.Split("\")|select -last 1) + `
" copied in " + $secselapsed + " seconds at " + `
"{0:n2}" -f [int](($ffile.length/$secselapsed)/1mb) + " MB/s.");
$ffile.Close();
$tofile.Close();
}
}