wake-up-neo.com

Typ [System.IO.Compression.CompressionLevel] kann nicht gefunden werden. Stellen Sie sicher, dass die Assembly mit diesem Typ geladen ist

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?

24
Maven

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.

13
Raf

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.

24
bincob

Ü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.

0
user7413048