2016-04-04 7 views
-2

gelöscht bin ich sehr neu in diesem, aber ich habe ein Problem mit dem Löschen 30 Tage alten Dateien, die ich eine Antwort auf hier: Powershell - Delete subfolder(s) in folder with specific name(s) older than 30 daysLog was

Aber ich möchte eine Folge Frage auf, das machen.
Der Code, den ich verwende, ist dies:

gci P:\ -directory -recurse | ?{$_.FullName -match ".:\\.+?\\.+?\\.+?\\.+?\\.+?\\" -and $_.CreationTime -lt (get-date).AddDays(-30)}|Remove-Item -recurse -whatif 

Ist es möglich, zu protokollieren, was ebenfalls gelöscht wird? Wäre toll, wenn die Größe der Dateien in der Protokolldatei enthalten wäre. Vielen Dank!

+2

Natürlich ist es möglich. Ersetzen Sie einfach den 'Remove-Item ...' -Teil mit 'ForEach-Object {}' und fügen Sie die Befehle log und remove in die Klammern ein. –

+0

Ich verstehe nicht wirklich, was Sie meinen. Ich habe mich erst letzte Woche mit Powershell beschäftigt. ForEach-Objekt {Remove-Item -recurse -force 'C: \ Pfad \ zu \ delete.log'} oder bin ich weg? (Weiß nicht wirklich, wie man sich anmeldet) – Boysen

+0

Nein. Er meinte etwa so: '... | ForEach-Object {"Löschen von $ ($ _. FullName)"> "C: \ path \ to \ deleted.log"; Remove-Item $ _. FullName -Recurse -Force} ' –

Antwort

1

Sprechen Sie die Entfernungsoperation ausführlich und die verbose stream in eine Datei umleiten:

... | Remove-Item -Recurse -Verbose 4> 'C:\path\to\your.log' 

Beachten Sie, dass diese zumindest Powershell v3 erfordert.

Wenn Sie nur anmelden wollen, was ohne sie wirklich löschen gelöscht würden, verwenden -WhatIf statt -Verbose:

... | Remove-Item -Recurse -WhatIf 

Sie können auch die beiden kombinieren:

$dryrun = $true # set to $false to actually delete 
... | Remove-Item -Recurse -Verbose -WhatIf:$dryrun 4> 'C:\path\to\your.log' 

jedoch -WhatIf Ausgang geht an die Host-Konsole, so dass es nicht in eine Datei umgeleitet werden kann. Sie könnten Start-Transcript als Workaround verwenden, aber das würde alles aufzeichnen, nicht nur die Möchtegern-Löschungen. Oder Sie könnten den gesamten Code/script (ohne Umleitungen) in einem neuen Powershell-Prozess auszuführen:

powershell.exe -File 'C:\path\to\your.ps1' > 'C:\path\to\your.log' 

Der Host-Ausgang eines Kindes Powershell-Prozess in seine STDOUT verschmolzen wird, so dass Sie es umleiten „von außen“ .

+0

Danke, hat perfekt funktioniert! – Boysen

+0

Auch wie kann ich nur protokollieren, was gelöscht werden soll, ohne es zu löschen? Ich bin wirklich neu und kann nur verschiedene Möglichkeiten zum Löschen finden .. – Boysen

+0

Kann nicht das Protokoll ohne zu löschen, um zu arbeiten. Es erstellt die Datei.log, aber es ist leer. '$ dryrun = $ true # auf $ false gesetzt, um tatsächlich zu löschen gci D: \ Shared \ transfer -recurse | ? {$ _. FullName -match ".: \\. +? \\. +? \\. +? \\" -und $ _. CreationTime -lt (get-date) .AddDays (-15)} | Remove-Item -Recurse -Verbose -WhatIf: $ dryrun 4> & 1> 'C: \ Scripts \ Übertragungsordner \ WhatWillBeDeleted.log'' – Boysen