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
Please also mark the comments that contributed to the solution of the article
Kommentar vom Moderator Dani am Mar 12, 2015 um 22:14:09 Uhr
Formatierung hinzugefügt.
Content-Key: 266061
Url: https://administrator.de/contentid/266061
Printed on: April 25, 2024 at 22:04 o'clock
2 Comments
Latest comment
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.