我有一个运行 Windows 2012 R2 的应用程序服务器,它会生成大量日志文件,以至于它会半定期地在可用空间之外运行应用程序卷。由于应用程序本身的限制,我无法移动或重命名日志文件或启用 NTFS 重复数据删除,并且由于它不再是十年前,我不想使用批处理或 vbscript 来执行此操作为了我。
日志文件都在应用程序安装目录的各个子文件夹中,扩展名不同(一个组件添加日期作为日志文件扩展名),并且应用程序安装目录中有一个空间,因为应用程序开发人员是恶意的。写入日志的子文件夹至少专门用于写入日志。这也是一个 CPU 密集型应用程序,因此我不想自己压缩日志文件夹并招致与为日志写入压缩文件相关的 CPU 损失。
如何使用 PowerShell 对早于 x 天的日志文件启用 NTFS 压缩?
由于 PowerShell 对文件操作的支持仍然相当缺乏,最简单的解决方案是创建一个 PowerShell 脚本来调用该
compact.exe
实用程序并将其设置为计划任务。因为路径名中的空格,所以要compact.exe
直接调用,而不是使用Invoke-WMIMethod
和CIM_DataFile
类(处理路径中的空格会导致很多额外的工作)。假设 X 的年龄为 3 天,您的 PowerShell 脚本将如下所示:
第二个条件是通过跳过已经压缩的文件(在第一次运行此脚本后会出现)来加速脚本执行。如果您想要,或者有很多不同的日志记录子文件夹,那么从重复的 PowerShell 代码中创建一个函数可能是有意义的,这将是一个相当简单的练习。
使用数组和 foreach 循环可以避免重复代码:
......
Invoke-WmiMethod -Path "Win32_Directory.Name='C:\FolderToCompress'" -Name compress
无需依赖 compact.exe 即可做到这一点,这是一种通过直接调用 NTFS 压缩的“纯 powershell”方法。这也处理来自日本的文件名和 unicode 文件名中的空格,后者很难提供给 compact.exe 命令行。另请参阅https://docs.microsoft.com/en-us/windows/win32/api/winioctl/ni-winioctl-fsctl_set_compression。
如果这些日志文件不在 C: 上,请使用 Server 2012 R2 重复数据删除功能。然后,您可以将其配置为仅删除 3 天前的 .log 文件(默认设置)。控制它的第二种方法,或者当它在 C 上时:将日志目录移动到不同的驱动器并使用 JUNCTION 指向新位置,最容易使用https://schinagl的 Hardlink-Shell-Extension 创建.priv.at/nt/hardlinkshellext/linkshellextension.html - 然后在顶部使用 2012 R2 重复数据删除。我已经看到日志文件和 SQl-dump-for-backup 驱动器的重复数据删除率超过 90%。