web-dev-qa-db-ja.com

タイプ[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を使用しています。

どうすればそれを機能させることができますか?

30
Maven

PowerShellセッションに 。NET クラスを手動で追加できます。

スクリプトから[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がシステムに正常にインストールされ、System.IO.Compression.FileSystem.dllは実際に存在します。

14
Raf

代わりにAdd-Type -AssemblyName System.IO.Compression.FileSystemを使用してみてください。よりクリーンで、Visual Studioのインストールを必要とする参照アセンブリに依存しません。

27
bincob

また、$ pshome exe.configファイルを確認してください。構成ファイルに4ではなく.NET 2.0がリストされていたため、Powershell ISEが.NETアセンブリのロードを拒否したという問題がありました。

0
user7413048