Wie kann ich PowerShell verwenden, um die NTFS-Komprimierung für Protokolldateien zu aktivieren, die älter als x Tage sind?

9

Ich habe einen Anwendungsserver unter Windows 2012 R2, der ein hohes Volumen an Protokolldateien generiert, bis das Anwendungsvolumen halbjährlich nicht mehr über genügend freien Speicherplatz verfügt. Aufgrund von Einschränkungen durch die Anwendung selbst kann ich die Protokolldateien nicht verschieben oder umbenennen oder die NTFS-Datendeduplizierung aktivieren. Da dies noch keine zehn Jahre her ist, möchte ich dazu keinen Batch oder vbscript verwenden für mich.

Die Protokolldateien befinden sich alle in verschiedenen Unterordnern des Anwendungsinstallationsverzeichnisses mit unterschiedlichen Erweiterungen (eine Komponente fügt das Datum als Protokolldateierweiterung hinzu), und das Anwendungsinstallationsverzeichnis enthält einen Leerzeichen, da die Anwendungsentwickler böswillig sind. Die Unterordner, in die die Protokolle geschrieben werden, werden zumindest ausschließlich zum Schreiben von Protokollen verwendet. Dies ist auch eine stark CPU-gebundene Anwendung, daher möchte ich die Protokollordner nicht selbst komprimieren und die CPU-Strafe für das Schreiben komprimierter Dateien für die Protokolle verursachen.

Wie kann ich PowerShell verwenden, um die NTFS-Komprimierung direkt für Protokolldateien zu aktivieren, die älter als x Tage sind?

HopelessN00b
quelle

Antworten:

7

Die einfachste Lösung besteht darin, ein PowerShell-Skript zu erstellen, um das compact.exeDienstprogramm aufzurufen und als geplante Aufgabe einzurichten , da die PowerShell-Unterstützung für Dateivorgänge immer noch eher fehlt . Aufgrund des Leerzeichens im Pfadnamen möchten Sie compact.exedirekt aufrufen , anstatt Invoke-WMIMethoddie CIM_DataFileKlasse zu verwenden (was viel zusätzlichen Aufwand für den Umgang mit dem Leerzeichen im Pfad verursacht).

Unter der Annahme eines Alters von 3 Tagen für X würde Ihr PowerShell-Skript ungefähr so ​​aussehen:

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

...

Die zweite Bedingung besteht darin, die Skriptausführung zu beschleunigen, indem bereits komprimierte Dateien übersprungen werden (die nach der ersten Ausführung dieses Skripts vorhanden wären). Wenn Sie viele verschiedene Unterordner für die Protokollierung haben wollten oder hatten, wäre es wahrscheinlich sinnvoll, aus diesem wiederholten PowerShell-Code eine Funktion zu machen, was eine ziemlich triviale Übung wäre.

HopelessN00b
quelle
challange --- - Kannst du als wiederverwendbares Cmdlet mit Mitgliedern und Parametern schreiben? Ich schönes Skript.
Sum1sAdmin
@ Rob-d Wenn ich nicht für meinen Lebensunterhalt arbeiten müsste, sicher. :) Wie ich bereits angedeutet habe, toleriert das reine Ausführen in PowerShell mit Invoke-WMIMethod keine Leerzeichen in Ihrem Pfad, und ich hasse die Tokenisierung von Zeichenfolgen als Programmieraufgabe. Also viel Mühe und nicht viel Rückkehr, also besteht nicht die Gefahr, dass es bald passiert.
HopelessN00b
yep - the day job!, Es ist diesen Monat ziemlich langsam, also war ich ein bisschen hier. - Wir könnten das eingebaute Material für diesen Get-ChilidItem-Filter * .log | verwenden Dabei ist $ _. LastWriteTime -gt (Get-Date) .AddDays (-3) | zip-file -komprimierung optimal
Sum1sAdmin
4

Der wiederholte Code kann durch Verwendung eines Arrays und einer foreach-Schleife vermieden werden:

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

..... .....

boossy
quelle
0

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

Andrew Vawter
quelle
Wie forfiles /m *. log /p path /d -7 /c "cmd /c compact @path"wäre es mit den alten oder für Ordner wäre es fast das gleiche
djdomi
0

Wenn sich diese Protokolldateien nicht in C befinden: Verwenden Sie die Server 2012 R2-Deduplizierungsfunktion. Sie können es dann so konfigurieren, dass nur .log-Dateien dedupiert werden, die drei Tage alt sind (Standardeinstellung). Die zweite Methode, um dies unter Kontrolle zu bringen, oder wenn es sich in C befindet: Verschieben Sie das Protokollverzeichnis auf ein anderes Laufwerk und verwenden Sie eine JUNCTION, um auf den neuen Ort zu verweisen, der am einfachsten mit der Hardlink-Shell-Erweiterung von https: // schinagl zu erstellen ist .priv.at / nt / hardlinkshellext / linkshellextension.html - und verwenden Sie dann die 2012 R2-Deduplizierung. Ich sehe Deduplizierungsraten weit über 90% bei Protokolldateien und den SQl-Dump-for-Backup-Laufwerken.

JouMxyzptlk
quelle