Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi Allen,

Ik momenteel bezig met Powershell te leren (veel te laat met gestart...) en ik wou een simpel script maken om het volgende uit te voeren:

Overzicht:
Folder1
- Subfolder1
- bestand1
Folder2
- Subfolder1
- bestand1

Ik zou alle subfolders willen verwijderen in meerdere folders maar zonder de bestanden in de hoofd folder te verwijderen. Dus enkel de subfolders.

Ik heb al wat rond zitten zoeken maar ik kom nergens iets tegen waar je enkel de subfolder met kan verwijderen en de bestanden laat bestaan.
Ik basseer me dan ook deels op deze technet post: https://technet.microsoft.com/en-us/library/ee176938.aspx

Dus al ik: remove-item .\Folder1\* doe dan wis ik alles in die folder. Als ik -exclude er aan toevoeg dan kan ik enkel een extensie meegeven. Omgekeerd kan ik ook -include toevoegen maar opnieuw met een extensie. En dit dan alleen maar enkel voor Folder1 en niet voor Folder2, 3, ...

Kan me iemand even een duwtje in de juiste richting geven?

PS: Met dat ik nog een beginneling ben in PS, mag ik vragen om het uit te leggen als je een script post? het is de bedoeling dat ik het zelf leer en niet altijd hulp hoef te vragen :) Thx

[ Voor 4% gewijzigd door Verwijderd op 16-06-2015 17:28 . Reden: typos ]


Acties:
  • 0 Henk 'm!

  • Oogje
  • Registratie: Oktober 2003
  • Niet online
Volgens mij moet je iets met get-childitem doen (folders ophalen) en dan de property psiscontainer gebruiken om alleen folders weg te gooien.

Any errors in spelling, tact, or fact are transmission errors.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 30-08 16:12
Edit : verkeerd gelezen. Ik post straks wel even een werkend script (wel uitgaande van PS3 of hoger)

[ Voor 107% gewijzigd door Killah_Priest op 16-06-2015 19:40 ]


Acties:
  • 0 Henk 'm!

  • YellowOnline
  • Registratie: Januari 2005
  • Laatst online: 28-03-2023

YellowOnline

BEATI PAVPERES SPIRITV

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#Ongetest, maar dit zou wel moeten zijn wat je wil...
#Eerst maken we een array met daarin de folders op welke je dit wil uitvoeren. Moet je nog vervolledigen.
$ParentFolders = @(Get-ChildItem <criteria>)
#Nu loopen we door die folders
ForEach ($ParentFolder in $ParentFolders)
    {
    #We vragen op welke folders - en enkel folders - bestaan in die ParentFolder en dat bewaren we opnieuw in een array
    $ChildFolders = @(Get-ChildItem | Where-Object { $_.PSIsContainer })
    Nu loopen we door deze array... 
    ForEach ($ChildFolder in $ChildFolders)
        {
        #en verwijderen al deze ChildFolders inclusief inhoud (-recurse). 
        Remove-Item $ChildFolder -Recurse 
        }
    }
    
#################################

#Het kan natuurlijk compacter, maar dan wordt het cryptischer. 
# Ik ben zelf sowieso niet gewoon zo beknopt te coden dus het kan zijn dat hier ergens een syntaxfout is.
#Maar ter illustratie:
Get-ChildItem <criteria> | % {Get-ChildItem | ? {$_.PSIsContainer} | Remove-ItemRecurse}


Zucht. Wil iemand een lexer voor PoSh maken?

Acties:
  • 0 Henk 'm!

  • Widow
  • Registratie: Juli 2003
  • Laatst online: 25-08 10:41
Verwijderd schreef op dinsdag 16 juni 2015 @ 17:26:
PS: Met dat ik nog een beginneling ben in PS, mag ik vragen om het uit te leggen als je een script post? het is de bedoeling dat ik het zelf leer en niet altijd hulp hoef te vragen :) Thx
Als je begint met Powershell, is één van de belangrijkste dingen om te weten dat het object georiënteerd is, in plaats van tekst-georiënteerd. Als je in UNIX gewend bent om e.e.a. te doen met grep, maak je een selectie uit een stuk tekst op basis van wat matched met grep. Als je met Powershell een selectie wilt maken, moet je dat niet doen op basis van de tekst, maar op basis van een attribute van een object. Toen ik begin met Powershell dacht ik teveel tekst-georiënteerd, maar zodra je eenmaal door hebt dat het met objecten werkt, snap je veel sneller hoe dingen werken :)

Niets is zo permanent als een tijdelijke oplossing.


Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 30-08 16:12
Get-ChildItem -Directory -Path <foldernaam> | get-childitem -Recurse | remove-item

Deze oneliner zou moeten doen wat jij wilt. Eventueel moet je nog een -force switch meegeven met remove-item (en op de 2e get-childitem) ivm hidden files etc.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
bedankt voor alle antwoorden, eventjes vrij druk gehad en nu pas tijd om er opnieuw aan de slag met te gaan. Aan de hand van de -whatif parameter heb ik wat zitten testen en spelen. En ik heb het aangepakt met de -exclude paramter.
Het was de bedoeling om mijn film bibliotheek uit te ruimen en deze is nu gebeurd met volgende command:

Get-ChildItem -Directory -Path Z:\Movies\ | get-childitem -Recurse | remove-item -exclude *.avi,*.mkv,*.jpg,*.srt,*.png,*.nfo -Force -recurse

Alle lege subfolders zijn verwijderd en alle overige zinloze bestanden zijn bij deze ook weg.

@Widow: ik ben gestart met een cbt nugget en daar hameren ze ook vrij hard op. Wat wel heel belangrijk is want ik maakte vroeger enkel maar bash scripts in linux.

Nogmaals bedankt iedereen voor alle input!
Pagina: 1