none
PS- Script Daten einer Ordnerherachie auslesen und mit einem Prefix versehen RRS feed

  • Frage

  • Sehr geehrte Community,

    ich bastel jetzt seid Tagen an einem Script rum, muss noch dazu sagen, dass ich sowas von blutiger Anfänger bin in Sachen PS aber mit viel lernen und eurer Hilfe wird das schon ^^ Danke mal hierfür im Vorraus.

    also folgende Geschichte... mein Script soll die Verzeichnisse (Pfad fix deklariert) auslesen. Und die darin befindlichen Daten mit einem Präfix, namenstechnisch abändern... damit ersichtlich wird, welche Daten Alt sind... aber die Fallunterscheidung kommt später und möchte ich dann auch erst selber probieren..

    Hier mal meine Codeansatz... der irgendwie nicht richtig rennt.

    $Verzeichniss ="C:\Pfadxyz"

    $prefix ="old_"

    $eintraege = Get-Childitem $Verzeichniss

    forEach($eintrag in $eintraege)

               {

                   Rename-Item $eintrag.FullName($prefix + $eintraege.name )

                }

    Was zum Guguck mach ich falsch, er erzeugt immer nen Ordner mit "old" und darin nochmal eine Datei mit dem Prefix,  ändert aber nicht die Dateinamen wie gewünscht.... Naja Vielen Dank schonmal für eure Intention, und freue mich schon auf ein Feedback,

    Grüße aus Wien Christian

    Mittwoch, 21. November 2012 08:40

Antworten

  • Du hast zwei Flüchtigkeitsfehler im Script: Du hast ein Array "$Eintraege" und fragst dann jeden "$eintrag" ab. Soweit so gut. Beim rename benutzt du aber dann statt des aktuellen "$eintrag.name" wieder "$eintraege.name".

    Sowas passiert häufig, wenn Variablennamen sich nicht genug unterscheiden. Benutze in so einen Fall einfach klar unterscheidbare Namen wie z.b. "$allfiles" und "$file".

    Der zweite Fehler ist, das die beiden Parameter bei rename-item nicht getrennt von einander sind.

    So gehts:

     
    $Verzeichniss ="D:\tmp\Backup\Switch"
    $prefix ="old_"
    $eintraege = Get-Childitem $Verzeichniss 
    
    forEach($eintrag in $eintraege) {           
              Rename-Item  $eintrag.FullName  ($prefix + $eintrag.name )
    }

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Mittwoch, 21. November 2012 11:14
    Moderator
  • Das geht so:

    $eintraege = Get-Childitem $Verzeichniss  | Where-Object { !$_.PSIsContainer }
     

    Erklärung: Get-childitem reicht nun über die Pipeline ("|") jeden Eintrag an Where-object weiter, welches wiederum nur die Einträge ($_) durchlässt, die nicht (!) dem Typ Ordner ("PSIsContainer") entsprechen.

    Grüße, Denniver

     

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 21. November 2012 12:49
    Moderator

Alle Antworten

  • Du hast zwei Flüchtigkeitsfehler im Script: Du hast ein Array "$Eintraege" und fragst dann jeden "$eintrag" ab. Soweit so gut. Beim rename benutzt du aber dann statt des aktuellen "$eintrag.name" wieder "$eintraege.name".

    Sowas passiert häufig, wenn Variablennamen sich nicht genug unterscheiden. Benutze in so einen Fall einfach klar unterscheidbare Namen wie z.b. "$allfiles" und "$file".

    Der zweite Fehler ist, das die beiden Parameter bei rename-item nicht getrennt von einander sind.

    So gehts:

     
    $Verzeichniss ="D:\tmp\Backup\Switch"
    $prefix ="old_"
    $eintraege = Get-Childitem $Verzeichniss 
    
    forEach($eintrag in $eintraege) {           
              Rename-Item  $eintrag.FullName  ($prefix + $eintrag.name )
    }

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Mittwoch, 21. November 2012 11:14
    Moderator
  • Mahlzeit,

    ein Gott, danke Denni (wenn ich dich so nennen darf)

    werds gleich nach dem Essen ausprobieren... wünsche noch eine erfolgreiche Arbeitswoche und verbleibe mit den Besten Wünschen aus Wien

    Chris

    Mittwoch, 21. November 2012 11:28
  • Hmm jetzt noch eine andere Frage, wie befülle ich dieses Array nur mit einzeldateien und nicht mit ordnern... besonders da die Ordnernamen beibehalten werden müssten? Jetzt benennt er bei mir nur die Ordner namentlich um aber nicht jedoch die Einzeldateien.

    Mittwoch, 21. November 2012 12:36
  • Das geht so:

    $eintraege = Get-Childitem $Verzeichniss  | Where-Object { !$_.PSIsContainer }
     

    Erklärung: Get-childitem reicht nun über die Pipeline ("|") jeden Eintrag an Where-object weiter, welches wiederum nur die Einträge ($_) durchlässt, die nicht (!) dem Typ Ordner ("PSIsContainer") entsprechen.

    Grüße, Denniver

     

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 21. November 2012 12:49
    Moderator
  • erstmals Danke für die ganzen Erklärungen..... alleine die zwei Nachrichten lassen meinen PS Horrizont gerade exponenziell steigen ;)

    Dann Grundlegend... gibt es ein Nachschlagewerk... weil auf den letzten Punkt wäre ich in 100 Jahren nicht drauf gekommen.... besonders was nach der Pipline alles steht... entzieht sich im Moment noch meiner Nachvollziehbarkeit...

    und dann versteh nicht ganz, wenn ich den script ausführe... druchforstet er immer nur den Ordner den in der Variable $Verzeichniss angegeben habe.. in unserem Beispiel wäre das jetzt "D:\tmp\Backup\Switch"

    würden sich jetzt Unterordner im diesem Verzeichniss befinden, hackelt der die nicht ab... woran liegt das?

    kann es sein, das hier der parameter -recurse fehlt?

    Schönen Feierabend noch

    Grüße Christian

    Mittwoch, 21. November 2012 14:16
  • Ja, für Unterordner brauchst du noch "-recurse".

    Was das weitere Lernen betrifft, empfehle ich wie immer Tobias Weltners Powershell Buch. Du kannst natürlich auch mit den unzähligen Ressourcen aus dem Netz lernen.  Ein guter Powershell-Editor mit guter Onscreen-Hilfe ist übrigens auch sehr hilfreich, ab Powershell 3.0 ist der eingebaute ISE ganz tauglich, ich bevorzuge aber nach wie vor den ebenfalls kostenlosen PowerGUI.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 21. November 2012 15:24
    Moderator