Hop*_*00b 12 windows powershell ntfs windows-server-2012-r2 powershell-v4.0
我有一个运行 Windows 2012 R2 的应用程序服务器,它生成大量日志文件,以至于它半定期运行应用程序卷的可用空间不足。由于应用程序本身的限制,我无法移动或重命名日志文件或启用 NTFS 重复数据删除,并且由于它不再是十年前,我不想使用批处理或 vbscript 来执行此操作为了我。
日志文件都在应用程序安装目录的各个子文件夹中,扩展名不同(一个组件添加日期作为日志文件扩展名),应用程序安装目录中有一个空格,因为应用程序开发人员是恶意的。写入日志的子文件夹至少专门用于写入日志。这也是一个严重受 CPU 限制的应用程序,因此我不想压缩日志文件夹本身并导致与为日志写入压缩文件相关的 CPU 损失。
如何使用 PowerShell 对超过 x 天的日志文件启用 NTFS 压缩,就地?
由于 PowerShell 对文件操作的支持仍然相当缺乏,最简单的解决方案是创建一个 PowerShell 脚本来调用该compact.exe实用程序并将其设置为计划任务。因为路径名中有空格,所以要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
}
...
Run Code Online (Sandbox Code Playgroud)
第二个条件是通过跳过已经压缩的文件(在第一次运行此脚本后会出现)来加速脚本执行。如果您想要,或者有很多不同的日志记录子文件夹,那么从重复的 PowerShell 代码中创建一个函数可能是有意义的,这将是一个相当简单的练习。
小智 5
使用数组和 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
}
}
Run Code Online (Sandbox Code Playgroud)
.....