J'ai écrit ce script PowerShell qui est censé créer des archives de tous les fichiers journaux sous une certaine plage de dates.
$currentDate = Get-Date;
$currentDate | Get-Member -Membertype Method Add;
$daysBefore = -1;
$archiveTillDate = $currentDate.AddDays($daysBefore);
$sourcePath = 'C:\LOGS';
$destPath='C:\LogArchieve\'+$archiveTillDate.Day+$archiveTillDate.Month+$archiveTillDate.Year+'.Zip';
foreach( $item in (Get-ChildItem $sourcePath | Where-Object { $_.CreationTime -le $archiveTillDate }) )
{
[Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem");
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal;
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcePath,$destPath, $compressionLevel, $false);
}
Cela fonctionne jusqu'à avant la boucle foreach
, mais une fois dans une boucle, il donne ces erreurs:
Unable to find type [System.IO.Compression.CompressionLevel]: make sure that the Assembly containing this type is loaded.
At line:4 char:65
+ $compressionLevel = [System.IO.Compression.CompressionLevel] <<<< ::Optimal;
+ CategoryInfo : InvalidOperation: (System.IO.Compression.CompressionLevel:String) [], RuntimeException
+ FullyQualifiedErrorId : TypeNotFound
Comme System.IO.Compression
fait partie de .NET 4.5, je l’ai installé sur le système, mais j’obtiens toujours ces erreurs.
Je suis sur Windows Server 2008 R2 et PowerShell v2.0.
Comment puis-je le faire fonctionner?
Vous pouvez ajouter manuellement une classe .NET à votre session PowerShell.
Supprimez [Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem");
de votre script et ajoutez les éléments suivants en haut:
Add-Type -Path "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll"
Ou sur une boîte 32 bits:
Add-Type -Path "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll"
Cela suppose que .NET 4.5 est installé correctement sur votre système et que System.IO.Compression.FileSystem.dll
existe réellement.
Essayez d'utiliser Add-Type -AssemblyName System.IO.Compression.FileSystem
à la place. Il est plus propre et ne dépend pas des assemblys de référence nécessitant une installation de Visual Studio.
Assurez-vous également de vérifier votre fichier exe.config $ pshome. J'ai eu un problème une fois où Powershell ISE a refusé de charger un assemblage .NET, car le fichier de configuration avait .NET 2.0 répertorié au lieu de 4.