web-dev-qa-db-ja.com

PowerShellを使用して、x日以上経過したログファイルでNTFS圧縮を有効にするにはどうすればよいですか?

大量のログファイルを生成するWindows 2012 R2を実行しているアプリケーションサーバーがあり、準定期的に空き領域が不足している状態でアプリケーションボリュームを実行しています。アプリケーション自体の制限により、ログファイルを移動または名前変更したり、NTFSデータ重複排除を有効にしたりすることはできません。また、10年前ではないため、バッチまたはvbscriptを使用してこれを実行したくありません。私のために。

ログファイルはすべてアプリケーションインストールディレクトリのさまざまなサブフォルダーにあり、拡張子が異なります(1つのコンポーネントがログファイル拡張子として日付を追加します)。アプリケーション開発者は悪意があるため、アプリケーションインストールディレクトリにはスペースが含まれます。ログが書き込まれるサブフォルダは、少なくともログを書き込むためにのみ使用されます。これはCPUに大きく依存するアプリケーションでもあるため、ログフォルダー自体を圧縮し、ログの圧縮ファイルの書き込みに関連するCPUのペナルティを発生させたくありません。

PowerShellを使用して、x日以上経過したログファイルに対してNTFS圧縮をインプレースで有効にするにはどうすればよいですか?

9
HopelessN00b

ファイル操作に対するPowerShellサポートがまだ不十分であるため、最も簡単な解決策は、compact.exeユーティリティを呼び出すPowerShellスクリプトを作成し、それをスケジュールされたタスクとして設定することです。パス名にスペースがあるため、compact.exeおよびInvoke-WMIMethodクラスを使用する代わりに、CIM_DataFileを直接呼び出す必要があります(スペースを処理するために多くの余分な労力が発生します)パス内)。

Xの経過時間が3日であるとすると、PowerShellスクリプトは次のようになります。

$logfolder="[location of the first logging subfolder]"
$age=(get-date).AddDays(-3)

Get-ChildItem $logfolder | where-object {$_.LastWriteTime -le $age -AND $_.Attributes -notlike "*Compressed*"} | 
ForEach-Object {
compact /C $_.FullName
}

$logfolder="[location of the next logging subfolder]"

Get-ChildItem $logfolder | where-object {$_.LastWriteTime -le $age -AND $_.Attributes -notlike "*Compressed*"} | 
ForEach-Object {
compact /C $_.FullName
}

...

2番目の条件は、すでに圧縮されたファイル(このスクリプトが最初に実行された後に存在する)をスキップすることにより、スクリプトの実行を高速化することです。必要に応じて、または多くの異なるログサブフォルダーがある場合は、繰り返しのPowerShellコードから関数を作成することはおそらく意味がありますが、これはかなり簡単な作業です。

7
HopelessN00b

繰り返しコードは、配列とforeachループを使用することで回避できます。

$logfolders=("D:\Folder\One","D:\Folder\Two")
$age=(get-date).AddDays(-3)

foreach ($logfolder in $logfolders) {
    Get-ChildItem $logfolder | where-object {$_.LastWriteTime -le $age -AND $_.Attributes -notlike "*Compressed*"} | 
    ForEach-Object {
    compact /C $_.FullName
    }
}

.....

4
boossy

Invoke-WmiMethod -Path "Win32_Directory.Name = 'C:\ FolderToCompress'" -Name compress

0
Andrew Vawter

これらのログファイルがCにない場合:Server 2012 R2重複排除機能を使用します。次に、3日経過した.logファイル(デフォルト)のみを重複排除するように構成できます。これを制御するための2番目の方法、またはそれがC上にある場合:ログディレクトリを別のドライブに移動し、JUNCTIONを使用して新しい場所をポイントします。Hardlink-Shell-Extensionで httpsから作成するのが最も簡単です。 ://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html -その後、2012 R2重複排除を使用します。ログファイルとSQl-dump-for-backupドライブの重複排除率が90%をはるかに超えることがわかりました。

0
JouMxyzptlk