Как я могу использовать PowerShell для включения сжатия NTFS на месте для файлов журналов старше x дней?

У меня есть сервер приложений под управлением Windows 2012 R2, который генерирует большой объем файлов журнала, вплоть до того, что он периодически запускает том приложения без свободного места. Из-за ограничений самого приложения я не могу перемещать или переименовывать файлы журнала или включать дедупликацию данных NTFS, и из-за того, что этого больше не было десять лет назад, я не хочу использовать пакет или vbscript для этого для меня.

Все файлы журнала находятся в различных подпапках каталога установки приложения с разными расширениями (один компонент добавляет дату в качестве расширения файла журнала), а в каталоге установки приложения есть пространство, потому что приложение разработчики недоброжелательны. Подпапки, в которые записываются журналы, используются исключительно для записи журналов, по крайней мере. Это приложение также сильно зависит от ЦП, поэтому я не хочу сжимать сами папки журналов и нести потери ЦП, связанные с записью сжатых файлов для журналов.

Как я могу использовать PowerShell для включения сжатия NTFS на месте для файлов журнала старше x дней?

7
задан 28 April 2016 в 22:00
4 ответа

Самое простое решение, поскольку поддержка 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
}

...

Второе условие - ускорить выполнение сценария, пропуская уже сжатые файлы (которые будут присутствовать после первого запуска этого сценария). Если бы вы хотели или у вас было много разных подпапок журналирования, вероятно, имело бы смысл сделать функцию из этого повторяющегося кода PowerShell, что было бы довольно тривиальным упражнением.

6
ответ дан 2 December 2019 в 23:30

Повторяющегося кода можно избежать, используя массив и цикл 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
ответ дан 2 December 2019 в 23:30

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

0
ответ дан 24 December 2019 в 09:49

Если эти файлы журналов находятся не на C: используйте функцию дедупликации Server 2012 R2. Затем вы можете настроить его для дедупликации только файлов .log, возраст которых составляет три дня (по умолчанию). Второй способ получить это под контролем, или когда он находится на C: переместите каталог журнала на другой диск и используйте JUNCTION, чтобы указать на новое место, проще всего создать с помощью Hardlink-Shell-Extension из https: //schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html - а затем использовать дедупликацию 2012 R2 поверх. Я видел, что показатели дедупликации намного превышают 90% для файлов журналов и дисков SQl-dump-for-backup.

-1
ответ дан 31 January 2020 в 03:52

Теги

Похожие вопросы