Como posso usar o PowerShell para habilitar a compactação NTFS, em vigor, em arquivos de log com mais de x dias?

6

Eu tenho um servidor de aplicativos, executando o Windows 2012 R2, que gera um alto volume de arquivos de log, a ponto de executar o volume do aplicativo sem espaço em uma base semi-regular. Devido às restrições do próprio aplicativo, não consigo mover ou renomear os arquivos de log nem ativar a desduplicação de dados do NTFS e, como não é mais dez anos, não desejo usar um lote ou vbscript para fazer isso para mim.

Os arquivos de log estão em várias subpastas do diretório de instalação do aplicativo, com diferentes extensões (um componente adiciona a data como a extensão do arquivo de log) e o diretório de instalação do aplicativo tem um espaço, porque os desenvolvedores de aplicativos são malévolos . As subpastas onde os logs são gravados são usadas exclusivamente para fins de gravação de logs, pelo menos. Esse também é um aplicativo altamente vinculado à CPU, portanto, não quero compactar as próprias pastas de log e incorrer na penalidade de CPU associada à gravação de arquivos compactados para os logs.

Como posso usar o PowerShell para habilitar a compactação NTFS, no local, em arquivos de log com mais de x dias?

    
por HopelessN00b 28.04.2016 / 21:00

2 respostas

5

A solução mais fácil, como ainda falta o suporte do PowerShell para operações de arquivos, é criar um script do PowerShell para chamar o utilitário compact.exe e configurá-lo como uma tarefa agendada. Devido ao espaço no nome do caminho, você deseja chamar compact.exe diretamente, em vez de usar Invoke-WMIMethod e a classe CIM_DataFile (o que causará muito esforço extra para lidar com o espaço no caminho). / p>

Assumindo uma idade de três dias para o X, seu script do PowerShell seria parecido com:

$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
}

...

A segunda condição existe para acelerar a execução do script pulando os arquivos já compactados (que estariam presentes após a primeira execução deste script). Se você quisesse, ou tivesse muitas subpastas de criação de log diferentes, provavelmente faria sentido executar uma função desse código repetitivo do PowerShell, o que seria um exercício bastante trivial.

    
por 28.04.2016 / 21:00
4

O código repetido pode ser evitado usando uma matriz e um loop 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
    }
}

.....

    
por 24.05.2016 / 09:04