Eintrag

Delete Files or Folder

Das Problem hat man öfters, dass entsprechende Log-Dateien gelöscht werden sollen. Auch hier hilft ein bischen Powershell
<br></br>################################################################<br></br># Powershell v3 MINIMUM<br></br>################################################################

################################################################
# Each line of the .ini File will be processed through the pipe.
# The splitted lines fill a hastable. Empty lines and lines beginning with
# ‚[‚ or ‚;‘ are ignored. $ht returns the results as a hashtable.
#
# thanks to Jeffrey Snover
#
################################################################
function Get-Settings()
{
BEGIN
{
$ht = @{}
}
PROCESS
{
$key = [regex]::split($_,’=‘)
if(($key[0].CompareTo(„“) -ne 0) `
-and ($key[0].StartsWith(„[„) -ne $True) `
-and ($key[0].StartsWith(„;“) -ne $True))
{
if($key.Count -lt 2)
{$ht.Add($key[0].Trim(), „“) }
else
{$ht.Add($key[0].Trim(), $key[1].Trim().Trim(„“““).Trim()) }
}
}
END
{
return $ht

}
}

################################################################
#
# based on an idea by
# Jeff Hicks http://www.petri.com/powershell-problem-solver-delete-empty-folders.htm
#
# PS E:\xxx> (get-item E:\xxx\Test).getfiles.OverloadDefinitions
# System.IO.FileInfo[] GetFiles(string searchPattern)
# System.IO.FileInfo[] GetFiles(string searchPattern, System.IO.SearchOption sear
# chOption)
# System.IO.FileInfo[] GetFiles()
#
# Interessant ist das GetFiles mit den SearchOptions
#
# PS E:\xxx> [enum]::GetValues([System.io.searchoption])
# TopDirectoryOnly
# AllDirectories
#
# D.h. wir können uns alle Ordner anzeigen lassen, wo es zumindest
# irgendwo darunter EINE Datei gibt
#
# PS E:\xxx> dir E:\xxx\Test -directory -Recurse | where {$_.GetFiles(„*“,“AllDire
# ctories“) } | select fullname
#
# FullName
# ——–
# E:\xxx\Test\t1 – Kopie (2)
# E:\xxx\Test\t1 – Kopie (2)\a
# E:\xxx\Test\t1 – Kopie (2)\a – Kopie
# E:\xxx\Test\t1 – Kopie (2)\a – Kopie (2)
# E:\xxx\Test\t1 – Kopie (2)\a – Kopie\a – Kopie (2)
# E:\xxx\Test\t1 – Kopie (2)\a – Kopie\b – Kopie (2)
# E:\xxx\Test\t1 – Kopie (2)\a – Kopie\b – Kopie (2)\a – Kopie (2)
# E:\xxx\Test\t1 – Kopie (2)\a – Kopie\b – Kopie (2)\b – Kopie (2)
# E:\xxx\Test\t1 – Kopie (2)\a – Kopie\b – Kopie (2)\b – Kopie (2)\a – Kopie (2)
#
# Nun brauchen wir nur mehr das INVERSE davon, also das NOT
#
# PS E:\xxx> dir E:\xxx\Test -directory -Recurse | where {-NOT $_.GetFiles(„*“,“Al
# lDirectories“) } | select fullname
#
# FullName
# ——–
# E:\xxx\Test\t1
# E:\xxx\Test\t1 – Kopie
# E:\xxx\Test\t1 – Kopie (3)
# E:\xxx\Test\t1 – Kopie (4)
# E:\xxx\Test\t1 – Kopie (2)\b
# E:\xxx\Test\t1 – Kopie (2)\b – Kopie
# E:\xxx\Test\t1 – Kopie (2)\b – Kopie (2)
# E:\xxx\Test\t1 – Kopie (2)\a – Kopie\b – Kopie (2)\b – Kopie (2)\b – Kopie (2)
#
################################################################
function remove-emptyfolder {
param ($root)
dir $root -Directory -recurse | where {-NOT $_.GetFiles(„*“,“AllDirectories“)} | del -recurse
}

################################################################
#
# main
#
################################################################
$hostVersionInfo = [int](get-host).Version.Major
if ( $hostVersionInfo -lt 3 )
{
write „This script needs at least Powershell v3″
exit -1
}

$iniPath = “ + (Split-Path -parent $MyInvocation.MyCommand.Definition) + „\CleanupLogs.ini“

$hashtable = (Get-Content $iniPath Get-Settings)

$prefixes = $hashtable.Item(„Prefix“).Split(„;“)
foreach($prefix in $prefixes) {
$folders2clean = $hashtable.Item($prefix + „Folder2Clean“).Split(„;“)
foreach($folder2clean in $folders2clean) {
$fileextensions = $hashtable.Item($prefix + „FileExtension“).Split(„;“)
foreach($fileextension in $fileextensions) {
$fileage = $hashtable.Item($prefix + „FileAge“)
try {
$recurse = $hashtable.Item($prefix + „Recurse“)
if($recurse -eq „0“) {
$files2delete = @(gci -Path $folder2clean -include $fileextension | Where {!$_.PSIsContainer -and ($_.LastWriteTime -lt (get-date).adddays($fileage))})
} else {
$files2delete = @(gci -Path $folder2clean -include $fileextension -Recurse | Where {!$_.PSIsContainer -and ($_.LastWriteTime -lt (get-date).adddays($fileage))})
}
foreach($file2delete in $files2delete) {
write-host $file2delete
remove-item $file2delete
}
}
catch { }
} # END foreach($fileextension in $fileextensions)
try {
$delEmptyFolders = $hashtable.Item($prefix + „DelEmptyFolders“)
if($delEmptyFolders -eq „1“) {
remove-emptyfolder $folder2clean
}
}
catch { }
} # END foreach($folder2clean in $folders2clean)
Und das dazu passende INI-File

[Global]
;
; unter PREFIX müssen die Prefixes für die nachfolgenden Einträge definiert werden
; mit STRICHPUNKT als Trenner
Prefix=“X1″

;
; nun folgen die eigentlichen Daten mit vorangestellten Prefix
; auch hier können mehrere Einträge mit STRICHPUNKT angegeben werden (ausgenommen beim FileAge und Recurse)
; Folder2Clean=““
; FileExtension=““
; ACHTUNG: will man ALLE Dateien eines Ordners, muss ein einfacher STERN angegeben werden
;
; FileAge=““
; Angabe MIT einem MINUS davor zb -1 für älter als current date minus eins
;
; Recurse=““
; Angabe 1 oder 0
;
X1Folder2Clean=“c:\inetpub\logs“
X1FileExtension=“*.log;*.info;*.warning“
X1FileAge=“-31″
X1Recurse=“1″

Dieser Eintrag ist vom Autor unter CC BY 4.0 lizensiert.