Подтвердить что ты не робот

Невозможно найти тип [System.IO.Compression.CompressionLevel]: убедитесь, что загружена сборка, содержащая этот тип

Я написал этот сценарий PowerShell для архивирования всех файлов журналов, созданных в определенный период времени.

$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);
}

Он работает до цикла foreach, но, попав в цикл, выдает следующие ошибки:

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

Поскольку System.IO.Compression является частью .NET 4.5, он установлен в системе, но я все еще получаю эти ошибки. Я на Windows Server 2008 R2 и использую PowerShell v2.0

Как я могу сделать эту работу?

4b9b3361

Ответ 1

Вы можете вручную добавить класс .NET в сеанс PowerShell.

Удалите [Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem"); из вашего script и добавьте следующее вверху:

Add-Type -Path "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll"

Или в 32-битном поле:

Add-Type -Path "C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll"

Это предполагает, что .NET 4.5 установлен OK в вашей системе и System.IO.Compression.FileSystem.dll действительно существует.

Ответ 2

Попробуйте вместо этого использовать Add-Type -AssemblyName System.IO.Compression.FileSystem. Он более чист и не имеет зависимости от ссылочных сборок, для которых требуется установка Visual Studio.

Ответ 3

Кроме того, обязательно проверьте файл $pshome exe.config. У меня возникла проблема, когда Powershell ISE отказался загружать сборку .NET, потому что в конфигурационном файле вместо .NET был указан .NET 2.0.