2017-07-22 3 views
1

J'ai écrit un script PowerShell pour l'archivage d'anciens fichiers journaux ou je dis un fichier de sortie d'une application Web en TB mais le script prend beaucoup de temps. J'ai fait quelques améliorations mais je n'ai pas pu accélérer plus d'ici.PowerShell | Besoin d'amélioration des performances

code:

#region Archive Files using 7zip 

[cmdletbinding()] 
Param 
(
[Parameter(Mandatory=$true, HelpMessage = "Path needs to be with trailing slash at the end of location.")] 
[string]$SourceFilesPath 
) 

$7zip = "C:\Program Files\7-Zip\7z.exe" 
$FilePath = "" 

foreach ($filename in $(Get-ChildItem $SourceFilesPath -Force -Recurse | where {$_.LastWriteTime -lt (get-date).AddDays(-1).ToShortDateString()})) 
{ 
    $FilePath = Get-ItemProperty $filename.FullName 
    $ZipFilePath = $filename.Directory.ToString() + "\ZippedFiles" + "\Archive_" + $filename.LastWriteTime.ToString("MMddyyyy") + ".7z" 

    $tempPath = ("-w"+"C:\Temp") 
    $OutputData = &$7zip a $tempPath -t7z $ZipFilePath $FilePath 
    $OutputData 
    if ($OutputData -contains "Everything is OK") 
    { 
     Remove-Item $FilePath -Force 
     Write-Output "File removed $FilePath" 
    } 
    Get-Item $ZipFilePath | ForEach-Object {$_.LastWriteTime = $filename.LastWriteTime} 
} 

#endregion 
+3

7zip utilise seulement deux noyaux en mode LZMA par défaut. Passez à l'utilisation de la compression LZMA2 pour activer tous les cœurs de processeur ou spécifiez un mode de compression plus rapide via les commutateurs de ligne de commande. – wOxxOm

+0

Je peux le faire mais je ne pense pas que cela apportera beaucoup d'amélioration car les tailles de fichier ne sont pas grandes. Les fichiers sont pour la plupart en kb et le maximum est de 5 mb mais le nombre de fichiers est énorme. donc peut-être j'ai besoin de quelque chose dans les filtres ou tout autre moyen de filtrage qui peut être plus rapide. – Imran

+0

Grand nombre de fichiers * petite taille = grande taille globale = temps de compression long. – wOxxOm

Répondre

0
#region Archive Files using 7zip 

[cmdletbinding()] 
Param 
(
    [Parameter(Mandatory = $true, HelpMessage = 'Path needs to be with trailing slash at the end of location.')] 
    [string]$SourceFilesPath 
) 
Import-Module ..\Invoke-Parallel.ps1 # Download from PSGallery 

$7zip = 'C:\Program Files\7-Zip\7z.exe' 

$fileToArchive = $(Get-ChildItem $SourceFilesPath -Force -Recurse | Where-Object -FilterScript { 
     $_.LastWriteTime -lt (Get-Date).AddDays(-1).ToShortDateString() 
}) 
$counter = 0 
$groupSize = 2000 # Will group items by 2,000 increments 
$groups = $fileToArchive | Group-Object -Property { 
    [math]::Floor($counter++/$groupSize) 
} 
$groups 

# This will spawn multiple instances of 7zip - depending on how many groups of 2,000 files exist 
$groups.Group | Invoke-Parallel -ScriptBlock { 
    $FilePath = $null 
    $fileName = $_ 
    $FilePath = Get-ItemProperty -Path $fileName.FullName 
    $ZipFilePath = $fileName.Directory.ToString() + '\ZippedFiles' + '\Archive_' + $fileName.LastWriteTime.ToString('MMddyyyy') + '.7z' 

    $tempPath = ('-w'+'C:\Temp') 
    $OutputData = &$Using:7zip a $tempPath -t7z $ZipFilePath $FilePath 
    $OutputData 
    if ($OutputData -contains 'Everything is OK') 
    { 
     Remove-Item $FilePath -Force 
     Write-Output -InputObject "File removed $FilePath" 
    } 
    Get-Item $ZipFilePath | ForEach-Object -Process { 
     $_.LastWriteTime = $fileName.LastWriteTime 
    } 
} 
+1

Après une correction dans le script. Cela fonctionne sur ma machine locale mais pas sur le serveur. Quand j'ai regardé le débogage, j'ai trouvé qu'il y avait une condition de vérification pour PSVersion dans le script Invoke-parallel et j'ai PSVersion sur 2.0 sur mon serveur 2008 R2. Btw, l'erreur est "" – Imran

+0

Get-RunspaceData: L'expression après '&' dans un élément de pipeline produit un objet non valide. Il doit se traduire par une virgule nd, un bloc de script ou un objet CommandInfo. A E: \ DevOps \ Scripts \ Invoke-Parallel.ps1: 569 CHAR: 37 + Get-RunspaceData <<<< + CategoryInfo: InvalidOperation: (:) [write-error], RuntimeException + FullyQualifiedErrorId: BadExpression, Get-RunspaceData – Imran

+0

Invoke-Parallel nécessite v3 +. –