特定の日付範囲ですべてのログファイルのアーカイブを作成することになっているこの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を使用しています。
どうすればそれを機能させることができますか?
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
は実際に存在します。
代わりにAdd-Type -AssemblyName System.IO.Compression.FileSystem
を使用してみてください。よりクリーンで、Visual Studioのインストールを必要とする参照アセンブリに依存しません。
また、$ pshome exe.configファイルを確認してください。構成ファイルに4ではなく.NET 2.0がリストされていたため、Powershell ISEが.NETアセンブリのロードを拒否したという問題がありました。