Ich habe einen Ordner (Benutzer) voller Benutzerordner, den wir für die temporäre Übertragung zwischen Benutzern verwenden. Ich möchte ein Skript planen können, um den Inhalt der Benutzerordner zu leeren, ohne die Benutzerordner zu entfernen oder Berechtigungen zu ändern.
Gibt es eine Möglichkeit, dies über eine Batchdatei zu tun? Ursprünglich dachte ich, ich könnte so etwas verwenden wie:
del /F \Benutzer**.*
Aber das hat nicht funktioniert.
Bitte helfen Sie!
Und danke dir!!
Antwort1
Sie verwenden Server 2012. Es gibt praktisch keinen Grund, Batch zu verwenden.
Hier, haben Sie etwas Powershell:
Foreach($_ In Get-ChildItem C:\Users -Recurse)
{
If(!$_.PSIsContainer) { Remove-Item $_.Fullname }
}
Dadurch werden alle Dateien im und unter dem Verzeichnisbaum C:\Users gelöscht, alle Verzeichnisse bleiben jedoch intakt.
Bearbeiten:
Wie wäre es damit:
Foreach($_ In Get-ChildItem C:\Users)
{
If($_.PSIsContainer)
{
Get-ChildItem $_.FullName -Recurse | Remove-Item
}
}
Wir erstellen jetzt also eine Liste mit Verzeichnissen der „ersten Ebene“ unter „C:\Users“ und löschen dann rekursiv den Inhalt jedes dieser Ordner, so dass am Ende nur „C:\Users“ und die erste Ebene der Unterverzeichnisse darunter übrig bleiben.
Bearbeiten:Da Sie erwähnt haben, dass Sie dies gerne besser verstehen würden, aber mit Powershell noch nicht vertraut sind, werde ich das obige Skript etwas ausführlicher erläutern.
Get-ChildItem C:\Users
ist im Grunde wie C:\> dir C:\Users
in DOS, aber Powershell verarbeitet und gibt alles in Form vonObjekte, nicht nur einfache Konsolenausgabe. Also durch das Lesen der ersten Zeile
Foreach($_ In Get-ChildItem C:\Users)
Das bedeutet, dass wir für jedes „Objekt“, das in C:\Users existiert, eine Schleife durchlaufen. Da wirnichtWenn Sie den -Recurse
Parameter hier verwenden, gibt Powershell nur die Verzeichnisliste der ersten Ebene von C:\Users zurück und dringt nicht in die Unterverzeichnisse vor.
If($_.PSIsContainer)
ist eine If-Anweisung, die bedeutet: „Wenn die Eigenschaft „PSIsContainer“ dieses aktuellen Objekts auf True gesetzt ist, was nur eine elegante Art ist zu sagen „Wenn dies ein Verzeichnis ist“, dann gehe in diese If-Schleife.“
Für jedes Unterverzeichnis unter C:\Users
geben wir also die If-Schleife ein. Nehmen wir also an, dass C:\Users
es drei Unterverzeichnisse gibt: C:\Users\joe
, C:\Users\kate
, und C:\Users\bill
. Diese Unterverzeichnisse können eine beliebige Anzahl von Dateien und Unterverzeichnissen enthalten.
Wir werden die If-Schleife also dreimal aufrufen, sodass es jedes Mal ungefähr so aussieht:
Get-ChildItem <C:\Users\joe> -Recurse | Remove-Item
Get-ChildItem <C:\Users\kate> -Recurse | Remove-Item
Get-ChildItem <C:\Users\bill> -Recurse | Remove-Item
Diese Zeile ruft den Inhalt dieses Unterverzeichnisses ab und der Schalter wird so angegeben, dass er alle Unterverzeichnisse von , , und -Recurse
durchsucht .joe
kate
bill
Dann nimmt es alle diese untergeordneten Objekte undRohresie zu , und Sie können sich das als einen schicken Alias für Remove-Item
vorstellen . Es löscht alle Dinge.Remove-Item
del
Sinn ergeben?