Powershell: Unterverzeichnis mehrerer Benutzer rekursiv löschen
Hallo zusammen,
ich habe ein Problem wo ich nicht weiter komme.
Ich habe ca. 700 Benutzerprofile, aus denen jeweils ein Unterordner samt Inhalt (Dateien und Ordner) gelöscht werden soll.
Da ich diese Möglichkeit häufiger verwenden möchte, habe ich ein Powershell-Script begonnen.
Beim Ausführen erhalte ich allerdings für jeden Unterordner unter Extensions folgende Fehlermeldungen:
Beim Debuggen kann ich erkennen das in der Schleifenvariablen $userArray[$i] der korrekte Pfad angezeigt wird.
Nachdem ich jetzt schon mehrere Stunden in die erfolglose Suche nach diesem Fehler gesteckt habe, wende ich mich nun an euch.
Vielen Dank für Eure Hilfe
Duckste
ich habe ein Problem wo ich nicht weiter komme.
Ich habe ca. 700 Benutzerprofile, aus denen jeweils ein Unterordner samt Inhalt (Dateien und Ordner) gelöscht werden soll.
Da ich diese Möglichkeit häufiger verwenden möchte, habe ich ein Powershell-Script begonnen.
$userArray = @(gci "\\server\profile\upm-profile\*\xa\UPM_Profile\AppData\Local\Google\Chrome\User Data\Default\Extensions")
for($i = 0; $i -lt $userArray.length; $i++)
{
# Überprüfe, ob Ordner vorhanden
if(Test-Path $userArray)
{
# Logdatei beschreiben
# Dauer ca. 6 Sek.
$anzahl = [System.IO.Directory]::GetFiles($userArray[$i],"*","AllDirectories").count
Write-Host $userArray[$i] $anzahl
#$Path = $userArray[$i]
Remove-Item $userArray[$i] -recurse -force
}
}
Temp 0
Remove-Item : Der Pfad "C:\WINDOWS\system32\WindowsPowerShell\v1.0\Temp" kann nicht gefunden werden, da er nicht vorhanden ist.
Bei L:\Eigene Dateien\Powershell\Scripte\Citrixprofil aufräumen.ps1:15 Zeichen:20
+ Remove-Item <<<< $userArray[$i] -recurse -force
+ CategoryInfo : ObjectNotFound: (C:\WINDOWS\syst...Shell\v1.0\Temp:String) [Remove-Item], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.RemoveItemCommand
Ausnahme beim Aufrufen von "GetFiles" mit 3 Argument(en): "Ein Teil des Pfades "C:\WINDOWS\system32\WindowsPowerShell\v1.0\pjkljhegncpnkpknbcohdijeoejaedia" konnte nicht gefunden werden."
Bei L:\Eigene Dateien\Powershell\Scripte\Citrixprofil aufräumen.ps1:12 Zeichen:50
+ $anzahl = [System.IO.Directory]::GetFiles <<<< ($userArray[$i],"*","AllDirectories").count
+ CategoryInfo : NotSpecified: (:) , MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
Nachdem ich jetzt schon mehrere Stunden in die erfolglose Suche nach diesem Fehler gesteckt habe, wende ich mich nun an euch.
Vielen Dank für Eure Hilfe
Duckste
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator Dani am 12.03.2015 um 23:14:09 Uhr
Formatierung hinzugefügt.
Content-ID: 266061
Url: https://administrator.de/contentid/266061
Ausgedruckt am: 23.11.2024 um 04:11 Uhr
2 Kommentare
Neuester Kommentar
Hallo Duckste, Willkommen auf Administrator.de!
der Code lässt sich so eigentlich auf eine Zeile reduzieren :
$userArray[$i] enthält das Objekt nicht den Pfad den du für remove-item brauchst. Den erhältst du aber aus dem Objekt mit $userArray[$i].Fullname
Also
oder alternativ auch so
Dann zu folgender Zeile: if(Test-Path $userArray) => Das geht ebenfalls in die Hose weil du ein Array übergibst anstatt einen String. Und außerdem ist dieser Check unnötig denn du hast die Pfade ja im Array stehen, sie existieren also weil du sie via get-childItem schon ausgelesen hast.
Grüße Uwe
p.s. in Zukunft nutze bitte Code-Tags für deinen Quellcode:
der Code lässt sich so eigentlich auf eine Zeile reduzieren :
remove-item "\\server\profile\upm-profile\*\xa\UPM_Profile\AppData\Local\Google\Chrome\User Data\Default\Extensions" -Recurse -Force -EA SilentlyContinue
Zu dem Fehler deines Codes
Beim Debuggen kann ich erkennen das in der Schleifenvariablen $userArray[$i] der korrekte Pfad angezeigt wird.
Das scheint nur so, es ist aber in Wirklichkeit ein Objekt, was du dir mit $userArray[$i].getType() anzeigen lassen kannst!$userArray[$i] enthält das Objekt nicht den Pfad den du für remove-item brauchst. Den erhältst du aber aus dem Objekt mit $userArray[$i].Fullname
Also
Remove-Item $userArray[$i].Fullname -Recurse -Force
$userArray[$i] | remove-item -recurse -force
Dann noch folgende Anmerkungen zu deinem Code:
In deiner ersten Zeile machst du um den gci-Befehl noch ein weiteres Array, das ist nicht nötig denn get-childitem gibt von sich aus schon ein Array oder $null zurück wenn es keine Files/Ordner gibt.Dann zu folgender Zeile: if(Test-Path $userArray) => Das geht ebenfalls in die Hose weil du ein Array übergibst anstatt einen String. Und außerdem ist dieser Check unnötig denn du hast die Pfade ja im Array stehen, sie existieren also weil du sie via get-childItem schon ausgelesen hast.
Grüße Uwe
p.s. in Zukunft nutze bitte Code-Tags für deinen Quellcode:
<code> Quellcode </code>
. Du siehst ja selber wie er sonst verunstaltet wird. Merci.