Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Powershell: Alle SMB Ordner löschen unter 1MB
- Ersteller xXFiskXx
- Erstellt am
Korben2206
Lt. Commander
- Registriert
- Nov. 2019
- Beiträge
- 1.194
Wenn es nur um Ordner in einer Ebene geht:
Ich habe den Löschbefehl erstmal auskommentiert damit du testen kannst ob nur die richtigen Ordner gelöscht werden.
Ganz oben beim $pfad und $minimum die gewünschten Werte eintragen.
Edit: kleine Optimierung von @nkler eingefügt (wenn Minimum überschritten direkt zum nächsten Ordner weiter). Macht es ggf. etwas schneller.
PowerShell:
$pfad = 'C:\Test'
$minimum = 1000000
$ordnerListe = Get-ChildItem -Path $pfad -Directory
foreach ($ordner in $ordnerListe) {
$size = 0
foreach ($datei in (Get-ChildItem -Path $ordner.Fullname -File -Recurse)) {
$size += $datei.Length
if ($size -gt $minimum) { break }
}
if ($size -lt $minimum) {
Write-Host "Loesche $($ordner.Name) [$size]"
# Remove-Item -Path $ordner.FullName -Force
}
}
Ganz oben beim $pfad und $minimum die gewünschten Werte eintragen.
Edit: kleine Optimierung von @nkler eingefügt (wenn Minimum überschritten direkt zum nächsten Ordner weiter). Macht es ggf. etwas schneller.
Zuletzt bearbeitet:
nkler
Lieutenant
- Registriert
- Juli 2006
- Beiträge
- 725
Ordner besitzen selber keine Größe, der Datenverbauch wird nur duch die Datein erzeugt.
Rechne doch die Größe aller Datein in einem Ordner zusammen (bei größer 1 MB kannst du stoppen und Unterordner beachten). Und wenn 1 MB nicht erreicht wird, dann kannst du alle Dateien löschen.
Anschließend einfach alle leeren Ordner löschen.
Rechne doch die Größe aller Datein in einem Ordner zusammen (bei größer 1 MB kannst du stoppen und Unterordner beachten). Und wenn 1 MB nicht erreicht wird, dann kannst du alle Dateien löschen.
Anschließend einfach alle leeren Ordner löschen.
leipziger1979
Rear Admiral
- Registriert
- Dez. 2014
- Beiträge
- 6.101
Wie soll das bei Unterordnern funktionieren?
Hast 5 Unterordner mit je 500kb, werden nicht gelöscht.
Der Ordner der die 5 Unterordner aber enthält ist ja 2,5MB groß, wird also gelöscht.
Wie soll das Script nun entscheiden?
Hast 5 Unterordner mit je 500kb, werden nicht gelöscht.
Der Ordner der die 5 Unterordner aber enthält ist ja 2,5MB groß, wird also gelöscht.
Wie soll das Script nun entscheiden?
Auf meinen Internen Laufwerken funktioniert es schonmal. Bei meinem SMB Laufwerk bekomme ich allerdings immer den Fehler "kann nicht entfernt werden: Die Anforderung wird nicht unterstützt"Korben2206 schrieb:Wenn es nur um Ordner in einer Ebene geht:
PowerShell:$pfad = 'C:\Test' $minimum = 1000000 $ordnerListe = Get-ChildItem -Path $pfad -Directory foreach ($ordner in $ordnerListe) { $size = 0 foreach ($datei in (Get-ChildItem -Path $ordner.Fullname -File -Recurse)) { $size += $datei.Length if ($size -gt $minimum) { break } } if ($size -lt $minimum) { Write-Host "Loesche $($ordner.Name) [$size]" # Remove-Item -Path $ordner.FullName -Force } }
Benötigt Powerscript noch irgendwelche Schreibrechte? Über den Explorer lässt sich alles normal löschen
@leipziger1979: Genau andersrum, mit dem Löschen, aber ja, die Frage ist berechtigt.
Ich nehme an, es geht nur um Ordner auf einer Ebene?
@xXFiskXx: Es wird auch wirklich der Ordner und nicht die Freigabe selbst versucht zu löschen?
Also nicht \\Rechnername\Freigabe sondern \\Rechnername\Freigabe\Ordner
Und vielleicht wird das rekursive Löschen über SMB nicht unterstützt?
Ich meine, wenn du sagst, dass sich im Explorer alles normal löschen lässt, dann spricht es schon für richtige Ordner, und ich nehme an, dass es am rekursiven Löschen liegt.
Teste es doch mal mit einem leeren Ordner.
Ich nehme an, es geht nur um Ordner auf einer Ebene?
@xXFiskXx: Es wird auch wirklich der Ordner und nicht die Freigabe selbst versucht zu löschen?
Also nicht \\Rechnername\Freigabe sondern \\Rechnername\Freigabe\Ordner
Und vielleicht wird das rekursive Löschen über SMB nicht unterstützt?
Ich meine, wenn du sagst, dass sich im Explorer alles normal löschen lässt, dann spricht es schon für richtige Ordner, und ich nehme an, dass es am rekursiven Löschen liegt.
Teste es doch mal mit einem leeren Ordner.
Code:
Loesche Test [0]
Remove-Item : Das Element \\192.168.178.40\NVIDIA_SHIELD\Test\Neu kann nicht entfernt werden: Die Anforderung wird nicht unterstützt.
In C:\PS.ps1:13 Zeichen:9
+ Remove-Item -Path $ordner.FullName -Force
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : WriteError: (Neu:DirectoryInfo) [Remove-Item], IOException
+ FullyQualifiedErrorId : RemoveFileSystemItemIOError,Microsoft.PowerShell.Commands.RemoveItemCommand
Der Fehler kommt immer.
Mit dem Explorer habe ich auch oft Probleme mit Ordnern über SMB. Nach dem kopieren auf das Netzlaufwerk kann ich die Ordner nicht löschen, erst nach einem Rechner Neustart.
Mit Dateien gibt es nie Probleme, nur mit Ordnern.
Code:
$pfad = '\\192.168.178.40\Test'
$minimum = 1000000
$ordnerListe = Get-ChildItem -Path $pfad -Directory
foreach ($ordner in $ordnerListe) {
$size = 0
foreach ($datei in (Get-ChildItem -Path $ordner.Fullname -File -Recurse )) {
$size += $datei.Length
if ($size -gt $minimum) { break }
}
if ($size -lt $minimum) {
Write-Host "Loesche $($ordner.Name) [$size]"
Remove-Item -Path $ordner.FullName
}
}
Danke!
Ohne -Force funktioniert es
Nur wie bekomme ich diese Meldung weg?
"Der Order verfügt über untergeordnete Elemente, und der Recurse-Parameter wurde nicht angegeben".
Nach Enter wird zwar alles gelöscht, aber wäre super wenn es auch unsichtbar funktionieren würde ohne Eingabe.
Korben2206
Lt. Commander
- Registriert
- Nov. 2019
- Beiträge
- 1.194
Glaube Remove-Item hat auch einen -Recurse Parameter. Evtl. hilft das.
Korben2206 schrieb:Glaube Remove-Item hat auch einen -Recurse Parameter. Evtl. hilft das.
-Recurse dranhängen hat funktioniert.rsfb schrieb:Ja -Recurse wäre der passende Parameter dafür
Falls es nicht zu aufwendig ist.
Kann man sich auch vor dem löschen die Ordner auflisten lassen die gelöscht werden sollen? So das man erst bestätigen muss.
nicht schön, sollte aber funktionieren. Du musst J drücken zum löschen, bei N springt er in den nächsten Ordner, andere Eingaben akzeptiert er nicht.
PowerShell:
$pfad = '\\192.168.178.40\Test'
$minimum = 1000000
$ordnerListe = Get-ChildItem -Path $pfad -Directory
foreach ($ordner in $ordnerListe) {
$size = 0
foreach ($datei in (Get-ChildItem -Path $ordner.Fullname -File -Recurse )) {
$size += $datei.Length
if ($size -gt $minimum) { break }
}
if ($size -lt $minimum) {
$i = 0
while ($i -eq 0)
{
$confirm = Read-Host "Soll $($ordner.Name) gelöscht werden? Tippe J für Ja, oder N für Nein"
if ($confirm -eq "J")
{
Write-Host "Loesche $($ordner.Name) [$size]"
Remove-Item -Path $ordner.FullName
$i = 1
}
elseif ($confirm -eq "N")
{
Write-Host "Überspringe $($ordner.Name) [$size]"
$i = 1
}
else
{
Write-Host "ungültige Eingabe"
}
}
}
N
NotNerdNotDau
Gast
PowerShell:
$pfad = '\\192.168.178.40\Test'
$minimum = 1000000
$ordnerListe = Get-ChildItem -Path $pfad -Directory
foreach ($ordner in $ordnerListe) {
$size = 0
foreach ($datei in (Get-ChildItem -Path $ordner.Fullname -File -Recurse )) {
$size += $datei.Length
if ($size -gt $minimum) { break }
}
if ($size -lt $minimum) {
[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$DEL = [System.Windows.Forms.MessageBox]::Show("$($Ordner.Name):`n`nSollen die Ordner unwiederbringlich gelöscht werden?","Zu löschende Ordner!","YESNO","Question")
If ($DEL -Eq "YES")
{
Write-Host "Loesche $($ordner.Name) [$size]"
Remove-Item -Path $ordner.FullName
}
ElseIf ($DEL -Eq "NO")
{
Exit
}
}
}
@rsfb
Da kommt immer ein Fehler
+ CategoryInfo : ParserError: ( [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace
@NotNerdNotDau
Das Funktioniert zwar, aber ich muss jeden Ordner einzeln mit J bestätigen.
Eine Auflistung aller Ordner die gelöscht werden sollen im Powershell Fenster wäre besser, so das ich nur einmal mit J bestätigen muss.
Wenn es zu aufwendig ist, lasse ich das erstmal so laufen ohne Auflistung. Solange ich den richtigen Pfad angebe, wird mir da denke ich nichts falsches gelöscht^^
Da kommt immer ein Fehler
- foreach ($ordner in $ordnerListe) {
- ~
+ CategoryInfo : ParserError: ( [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndCurlyBrace
@NotNerdNotDau
Das Funktioniert zwar, aber ich muss jeden Ordner einzeln mit J bestätigen.
Eine Auflistung aller Ordner die gelöscht werden sollen im Powershell Fenster wäre besser, so das ich nur einmal mit J bestätigen muss.
Wenn es zu aufwendig ist, lasse ich das erstmal so laufen ohne Auflistung. Solange ich den richtigen Pfad angebe, wird mir da denke ich nichts falsches gelöscht^^
N
NotNerdNotDau
Gast
Der Fehler bei dem Code von rsfb kommt deshalb, weil dort die schließende geschweifte Klammer des zweiten foreach fehlt.xXFiskXx schrieb:@rsfb
Da kommt immer ein Fehler
PowerShell:
}
}
}
Stimmt, die Meldung ist in der foreach-Schleife und wiederholt sich ständig.xXFiskXx schrieb:Das Funktioniert zwar, aber ich muss jeden Ordner einzeln mit J bestätigen.
Versuche es mal so:
PowerShell:
$pfad = '\\192.168.178.40\Test'
$minimum = 1000000
$ordnerListe = Get-ChildItem -Path $pfad -Directory
foreach ($ordner in $ordnerListe) {
$size = 0
foreach ($datei in (Get-ChildItem -Path $ordner.Fullname -File -Recurse )) {
$size += $datei.Length
if ($size -gt $minimum) { break }
}
if ($size -lt $minimum) {
[Void][System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$DEL = [System.Windows.Forms.MessageBox]::Show("$($Ordner.Name):`n`nSollen die Ordner unwiederbringlich gelöscht werden?","Zu löschende Ordner!","YESNO","Question")
If ($DEL -Eq "YES")
{
DelDir
Return
}
ElseIf ($DEL -Eq "NO")
{
Exit
}
}
}
Function DelDir
{
cls
Write-Host "Loesche $($ordner.Name) [$size]"
Remove-Item -Path $ordner.FullName
}
Zuletzt bearbeitet von einem Moderator:
@NotNerdNotDau
Da kommt leider auch für jeden Ordner eine einzelne lösch abfrage. Ich lasse das jetzt erstmal so laufen ohne Bestätigung.
Damit kein falscher Ordner gelöscht wird, kann ich ja -exclude nutzen, das funktioniert ganz gut.
Da kommt leider auch für jeden Ordner eine einzelne lösch abfrage. Ich lasse das jetzt erstmal so laufen ohne Bestätigung.
Damit kein falscher Ordner gelöscht wird, kann ich ja -exclude nutzen, das funktioniert ganz gut.
Ähnliche Themen
- Antworten
- 12
- Aufrufe
- 539
- Antworten
- 4
- Aufrufe
- 2.137