Cela faisait quelques temps que j’avais cette idée dans mon backlog cérébral, mais je m’y suis vraiment penché aujourd’hui car il a fallu que je contrôle un gros nombre de fichiers de log générés par une instruction Robocopy (350+).
Le principal challenge pour ce script est d’arriver à gérer correctement les lignes de statistiques de Robocopy puisque l’export est au simple format texte :
------------------------------------------------------------------------------
Total Copied Skipped Mismatch FAILED Extras
Dirs : 3765 3765 0 0 0 0
Files : 243503 243503 0 0 0 0
Bytes : 19.238 g 19.238 g 0 0 0 0
Times : 44:22:58 6:23:45 0:00:00 0:26:35
Ended : Monday, February 30, 1998 3:25:57 AM
Ces lignes ne sont pas directement interprétables comme telles par Powershell, il faut donc jouer du regex pour arriver à obtenir les valeurs qui nous intéressent. Si au départ je voulais simplement ressortir les FAILED, l’effort supplémentaire pour sortir l’intégralité des valeurs pour les répertoires et les fichiers est minime, ce script va donc inclure dans le fichier CSV de sortie l’intégralité des statistiques pour les répertoires et fichiers.
function parse {
param($inputstr)
$newstr = $inputstr -replace "[^0-9]" , '-'
$newstr -match '[^0-9]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+)[^0-9]+([0-9]+)'
$stats = @($matches[1],$matches[2],$matches[3],$matches[4],$matches[5],$matches[6])
return $stats
}
$output=@()
$logfiles = Get-ChildItem "*.log" | Select-Object Name
foreach($logfile in $logfiles) {
Write-Host "Parsing $($logfile.Name)"
$logcontent = Get-Content $logfile.Name
$strf = $logcontent[$logcontent.Count-5]
$strd = $logcontent[$logcontent.Count-6]
$statf = parse($strf)
$statd = parse($strd)
$dump = New-Object PSCustomObject
$dump | Add-Member -Name "Filename" -Value $($logfile.Name) -MemberType NoteProperty
$dump | Add-Member -Name "Files Total" -Value $statf[1] -MemberType NoteProperty
$dump | Add-Member -Name "Files Copied" -Value $statf[2] -MemberType NoteProperty
$dump | Add-Member -Name "Files Skipped" -Value $statf[3] -MemberType NoteProperty
$dump | Add-Member -Name "Files Mismatched" -Value $statf[4] -MemberType NoteProperty
$dump | Add-Member -Name "Files FAILED" -Value $statf[5] -MemberType NoteProperty
$dump | Add-Member -Name "Files Extras" -Value $statf[6] -MemberType NoteProperty
$dump | Add-Member -Name "Dirs Total" -Value $statd[1] -MemberType NoteProperty
$dump | Add-Member -Name "Dirs Copied" -Value $statd[2] -MemberType NoteProperty
$dump | Add-Member -Name "Dirs Skipped" -Value $statd[3] -MemberType NoteProperty
$dump | Add-Member -Name "Dirs Mismatched" -Value $statd[4] -MemberType NoteProperty
$dump | Add-Member -Name "Dirs FAILED" -Value $statd[5] -MemberType NoteProperty
$dump | Add-Member -Name "Dirs Extras" -Value $statd[6] -MemberType NoteProperty
$output+=$dump
}
$output | Export-Csv robocopy_logs_stats.csv -Delimiter ";" -Encoding utf8
Le script récupère la liste des fichiers en .log dans le répertoire d’exécution pour ensuite les lire. Par chance, les logs Robocopy ont toujours la même structure, ce qui permet d’avoir des valeurs fixes pour séparer les colonnes et récupérer les valeurs qui nous intéressent.
Ensuite, le fichier CSV est facilement interprété par Excel et on peut voir en un clin d’oeil les éventuelles erreurs de transfert et regarder dans le log concerné quels fichiers ou répertoires sont en échec.
Une version commentée du script est disponible en téléchargement.
Testé sur un transfert chez nous. J’ai dû changer les lignes 14 et 15 car sur mon fichier ça correspondait aux lignes 8 et 9.
Suggestion pour la ligne 13 : ajouter l’option « -last 10 » à get-content, pour éviter de lire le fichier complet (840 mo dans mon cas, un peu long).
Je me suis retrouvé avec les mêmes besoins. Alors j’ai créé cet outil si vous le souhaitez
https://github.com/Letalys/Powershell-ConvertFrom-RobocopLog