Не удается найти тип [System.ИО.Сжатие.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

As System.IO.Compression является частью .NET 4.5, я установил его в системе, но все же я получаю эти ошибки.

Я Windows Server 2008 R2 и PowerShell версии 2.0.

как я могу заставить его работать?

3 ответов


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

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

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 на самом деле существует.


попробуйте использовать . Он чище и не зависит от ссылочных сборок, которые нуждаются в установке Visual Studio.


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