peterleb
Goto Top

Powershell CleanTemp Script

Hallo,

nachdem mir killpid sehr geholfen hat, ein entsprechendes Script als Batch-Datei zu erstellen,
(Meine Frage)
folge ich nun seiner Empfehlung, das Ganze in der Powershell umzusetzen.

$SysTemp =[environment]::GetEnvironmentVariable('TEMP','Machine')  
$TempFileLocation = "$SysTemp","$env:TEMP"  

$TempFile = Get-ChildItem $TempFileLocation -Recurse
$TempFileCount = ($TempFile).count

if($TempFileCount -eq "0") {   
Write-Host "Keine Dateien in den Ordnern $TempFileLocation" -ForegroundColor Green  
}
Else {
$TempFile | Remove-Item -Confirm:$false -Recurse -Force -WarningAction SilentlyContinue -ErrorAction SilentlyContinue
Write-Host "$TempFileCount Dateien in den Ordnern $TempFileLocation gelöscht" -ForegroundColor Green  
}

Das funktioniert auch, aber es zählt alle Löschversuche - auch die gescheiterten.
Wie interveniere ich "Remove-Item", um auch die nicht gelöschten (gesperrten) Dateien und Ordner zu zählen?
In den Microsoft Docs steht: This cmdlet does not return any output.

Gruß
Peter

Content-Key: 579101

Url: https://administrator.de/contentid/579101

Ausgedruckt am: 28.03.2024 um 08:03 Uhr

Mitglied: 144260
Lösung 144260 13.06.2020 aktualisiert um 17:16:05 Uhr
Goto Top
Hier mal mit als Beispiel mit noch etwas mehr Details:
function Clean-Temp(){
    $usertmp = $env:TEMP
    $systmp = [environment]::GetEnvironmentVariable("TEMP","Machine")   
    $dirs = $usertmp,$(if($systmp -ne $usertmp){$systmp})
    $dirs | %{
        gci $_ -File -Force -Recurse -EA SilentlyContinue -PipelineVariable file | %{
            $obj = [pscustomobject]@{Path=$file.Fullname;Size = $file.Length;Result=''}  
            try{
                remove-item $file.FullName -Force -EA Stop
                $obj.Result = "OK"  
            }catch{
                $obj.Result = $_.Exception.Message
            }
            $obj
        }
        gci $_ -Directory -Recurse -Force -EA SilentlyContinue -PipelineVariable folder | sort {$_.FullName.Length} -Descending | %{
            $obj = [pscustomobject]@{Path=$folder.Fullname;Size = 0;Result=''}  
            try{
                remove-item $folder.FullName -Force -Recurse -EA Stop
                $obj.Result = "OK"  
            }catch{
                $obj.Result = $_.Exception.Message
            }
            $obj
        }
    }
}
$result = Clean-Temp
[array]$success = $result | ?{$_.Result -eq 'OK'}  
[array]$failed  = $result | ?{$_.Result -ne 'OK'}  

write-host "Overall statistics for deleted files/folders:`n$('='*40)" -F Green  
write-host "Success: $($success.count) / Total size: $('{0:F3}MB' -f (($success | measure Size -Sum -EA SilentlyContinue).Sum / 1MB))"  
write-host "Failed: $($failed.count) / Total size: $('{0:F3}MB' -f (($failed | measure Size -Sum -EA SilentlyContinue).Sum / 1MB))" -F Yellow  

write-host "`nDetails for failed files:`n$('='*40)" -F Green  
$failed | ft -AutoSize -Wrap

p.s. der Vertipper im Titel lässt sich auch nachträglich korrigieren.
Mitglied: PeterleB
PeterleB 13.06.2020 aktualisiert um 15:14:35 Uhr
Goto Top
Hallo,

Du bist ein Genie!
Das muß ich erstmal durcharbeiten.

Irgendwie sind Dateien aus dem $systemp "untergegangen".

Gruß
Peter
Mitglied: 144260
144260 13.06.2020 aktualisiert um 15:31:07 Uhr
Goto Top
Zitat von @PeterleB:
Irgendwie sind Dateien aus dem $systemp "untergegangen".
My fault, ein Tippfehler beim Erweitern, ist korrigiert.
Mitglied: PeterleB
PeterleB 13.06.2020 um 15:31:03 Uhr
Goto Top
Danke, Danke, Danke.
Mitglied: PeterleB
PeterleB 13.06.2020 aktualisiert um 16:37:26 Uhr
Goto Top
Hallo,

ich würde gern noch die Größensumme der erfolgreich gelöschten Dateien einbauen.
Ermitteln kann ich das ja so:

$Size = $Size += ($_ | Measure-Object Length -Sum).Sum #oder ?
$Size = $Size += ($file | Measure-Object Length -Sum).Sum

Das müßte dann in den catch-Block (Zeile 12) oder?

Gruß
Peter
Mitglied: 144260
144260 13.06.2020 aktualisiert um 16:28:12 Uhr
Goto Top
ich würde gern noch die Größensumme der erfolgreich gelöschten Dateien einbauen.
s.o.

Noch ein paar Kekse oder einen heißen Kaffee dazu ... face-smile?
Mitglied: PeterleB
PeterleB 13.06.2020 um 16:35:10 Uhr
Goto Top
Hi,

Fehlermeldung:
measure : Die Eigenschaft "Size" kann in keiner Eingabe eines Objekts gefunden werden.
In M:\Programmierung\CleanTemp\CleanTempFiles_killpid.ps1:31 Zeichen:90

back-to-top... / Total size: $('{0:F3}MB' -f (($success | measure Size -Sum).Sum / ...

back-to-top~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidArgument: (face-smile [Measure-Object], PSArgumentException
+ FullyQualifiedErrorId : GenericMeasurePropertyNotFound,Microsoft.PowerShell.Commands.MeasureObjectCommand

Könnte es tatsächlich "Length" heißen?

Gruß
Peter
PS: Hast Du eine Wunschliste oder ähnliches?
Mitglied: 144260
144260 13.06.2020 aktualisiert um 16:42:01 Uhr
Goto Top
Könnte es tatsächlich "Length" heißen?
Nein ist im custom object in "Size" umbenannt. War nur der Fall nicht berücksichtigt wenn der Failed-Teil leer ist. (hab hier immer "gelockte" files face-smile) s.o.
PS: Hast Du eine Wunschliste oder ähnliches?
Amazon Gutschein ist immer willkommen falls du das meinst face-wink.
Mitglied: PeterleB
PeterleB 13.06.2020 um 16:51:07 Uhr
Goto Top
Erfogreich: 13 / Total size: 0,000MB
Fehlgeschlagen: 9 / Total size: 0,000MB

?

Für den Gutschein brauche ich Deine E-Mail oder geht das auch anders?

Gruß
Peter
Mitglied: 144260
144260 13.06.2020 aktualisiert um 16:57:48 Uhr
Goto Top
Zitat von @PeterleB:

Erfogreich: 13 / Total size: 0,000MB
Fehlgeschlagen: 9 / Total size: 0,000MB

?
Musst du wohl nochmal den Code kopieren, geht hier einwandfrei
screenshot

Btw. Es kann auch Files geben die in Wirklichkeit keine Größe haben (Temporäre-Dateien bedingt) ...

Für den Gutschein brauche ich Deine E-Mail oder geht das auch anders?
Schick dir ne PN.
Mitglied: PeterleB
PeterleB 13.06.2020 um 17:04:44 Uhr
Goto Top
Ja, war mein Fehler.

Gruß
Peter
Mitglied: PeterleB
PeterleB 13.06.2020 um 18:13:33 Uhr
Goto Top
Wo bleibt die PN?