Windows

如何使用 PowerShell 對早於 x 天的日誌文件啟用 NTFS 壓縮?

  • January 31, 2020

我有一個執行 Windows 2012 R2 的應用程序伺服器,它會生成大量日誌文件,以至於它會半定期地在可用空間之外執行應用程序卷。由於應用程序本身的限制,我無法移動或重命名日誌文件或啟用 NTFS 重複數據刪除,並且由於它不再是十年前,我不想使用批處理或 vbscript 來執行此操作為了我。

日誌文件都在應用程序安裝目錄的各個子文件夾中,副檔名不同(一個組件添加日期作為日誌文件副檔名),並且應用程序安裝目錄中有一個空間,因為應用程序開發人員是惡意的。寫入日誌的子文件夾至少專門用於寫入日誌。這也是一個 CPU 密集型應用程序,因此我不想自己壓縮日誌文件夾並招致與為日誌寫入壓縮文件相關的 CPU 損失。

如何使用 PowerShell 對早於 x 天的日誌文件啟用 NTFS 壓縮?

由於 PowerShell 對文件操作的支持仍然相當缺乏,最簡單的解決方案是創建一個 PowerShell 腳本來呼叫該compact.exe實用程序並將其設置為計劃任務。因為路徑名中的空格,所以要compact.exe直接呼叫,而不是使用Invoke-WMIMethodCIM_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
}

...

第二個條件是通過跳過已經壓縮的文件(在第一次執行此腳本後會出現)來加速腳本執行。如果您想要,或者有很多不同的日誌記錄子文件夾,那麼從重複的 PowerShell 程式碼中創建一個函式可能是有意義的,這將是一個相當簡單的練習。

引用自:https://serverfault.com/questions/773696