我如何使用PowerShell在date早于x天的日志文件上启用NTFS压缩?

我有一台运行Windows 2012 R2的应用程序服务器,该服务器生成大量的日志文件,以至于它在半免费空间中运行应用程序卷。 由于应用程序本身的限制,我不能移动或重命名日志文件或启用NTFS数据重复数据删除,并且由于它不是十年前了,我不想使用批处理或VBScript来做到这一点为了我。

日志文件全部位于应用程序安装目录的各个子文件夹中,具有不同的扩展名(一个组件将date添加为日志文件扩展名),而应用程序安装目录中有一个空格,因为应用程序开发者是恶意的。 写入日志的子文件夹至less是专门用于写日志的目的。 这也是一个CPU限制的应用程序,所以我不想压缩日志文件夹本身,并导致与为日志写入压缩文件相关的CPU代价。

我怎样才能使用PowerShell在日志文件的x天之前就地启用NTFS压缩?

作为文件操作的PowerShell支持,最简单的解决scheme还是比较缺乏,就是创build一个PowerShell脚本来调用compact.exe实用程序,并将其设置为一个计划任务。 由于path名称中有空格,因此要直接Invoke-WMIMethod ,而不是使用Invoke-WMIMethodCIM_DataFile类(这将导致大量额外的工作量来处理path中的空间)。

假设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代码中生成一个函数可能是有意义的,这将是一个相当简单的练习。

重复的代码可以通过使用数组和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 } } 

…..