Ich habe dieses PowerShell-Skript geschrieben, das alle Protokolldateien unter einem bestimmten Datumsbereich archivieren soll.
$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);
}
Es funktioniert bis vor der foreach
-Schleife, aber einmal in einer Schleife gibt es folgende Fehler:
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
Da System.IO.Compression
ein Teil von .NET 4.5 ist, habe ich es auf dem System installiert, bekomme aber immer noch diese Fehler.
Ich bin auf Windows Server 2008 R2 und PowerShell v2.0.
Wie kann ich es funktionieren lassen?
Sie können Ihrer PowerShell-Sitzung manuell eine .NET -Klasse hinzufügen.
Entfernen Sie [Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem");
aus Ihrem Skript und fügen Sie oben Folgendes ein:
Add-Type -Path "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll"
Oder auf einer 32-Bit-Box:
Add-Type -Path "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll"
Dies setzt voraus, dass .NET 4.5 auf Ihrem System installiert ist und System.IO.Compression.FileSystem.dll
tatsächlich vorhanden ist.
Verwenden Sie stattdessen Add-Type -AssemblyName System.IO.Compression.FileSystem
. Es ist sauberer und hängt nicht von den Referenzbaugruppen ab, für die eine Installation von Visual Studio erforderlich ist.
Überprüfen Sie auch die Datei $ pshome exe.config. Ich hatte einmal ein Problem, bei dem Powershell ISE sich weigerte, eine .NET-Assembly zu laden, da in der Konfigurationsdatei .NET 2.0 statt 4 aufgelistet war.