Eu tenho um servidor de aplicativos, executando o Windows 2012 R2, que gera um grande volume de arquivos de log, a ponto de executar o volume do aplicativo sem espaço livre semi-regularmente. Devido a restrições do próprio aplicativo, não posso mover ou renomear os arquivos de log ou habilitar a desduplicação de dados NTFS e, como não faz mais dez anos, não quero usar um lote ou vbscript para fazer isso para mim.
Os arquivos de log estão todos 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 nele, porque os desenvolvedores do aplicativo 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. Este também é um aplicativo fortemente 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, in-loco, em arquivos de log com mais de x dias?
A solução mais fácil, já que o suporte do PowerShell para operações de arquivo ainda é escasso, é criar um script do PowerShell para chamar o
compact.exe
utilitário e configurá-lo como uma tarefa agendada. Por causa do espaço no nome do caminho, você deseja chamarcompact.exe
diretamente, em vez de usarInvoke-WMIMethod
e aCIM_DataFile
classe (o que causará muito esforço extra para lidar com o espaço no caminho).Assumindo uma idade de 3 dias para X, seu script do PowerShell seria algo como:
A segunda condição é acelerar a execução do script ignorando os arquivos já compactados (que estariam presentes após a primeira execução do script). Se você quisesse, ou tivesse muitas subpastas de log diferentes, provavelmente faria sentido criar uma função a partir desse código repetido do PowerShell, o que seria um exercício bastante trivial.
O código repetido pode ser evitado usando um array e um loop foreach:
.....
Invoke-WmiMethod -Path "Win32_Directory.Name='C:\FolderToCompress'" -Compactação de nome
É possível fazer isso sem precisar depender do compact.exe, um método "puro powershell" chamando a compactação NTFS diretamente. Isso também lida com espaços em nomes de arquivos e nomes de arquivos unicode do Japão, os últimos são difíceis de fornecer a uma linha de comando compact.exe. Consulte https://docs.microsoft.com/en-us/windows/win32/api/winioctl/ni-winioctl-fsctl_set_compression também.
Se esses arquivos de log não estiverem em C: use o recurso de desduplicação do Server 2012 R2. Você pode então configurá-lo para desfazer a duplicação apenas de arquivos .log com três dias (o padrão). O segundo método para controlar isso, ou quando estiver em C: Mova o diretório de log para uma unidade diferente e use uma JUNÇÃO para apontar para o novo local, mais fácil de criar com Hardlink-Shell-Extension de https://schinagl .priv.at/nt/hardlinkshellext/linkshellextension.html - e, em seguida, use a desduplicação 2012 R2 na parte superior. Eu vi taxas de desduplicação muito acima de 90% em arquivos de log e nas unidades SQL-dump-for-backup.