none
Dateien und Ordner umbennen RRS feed

  • Frage

  • Hallo,

    ich hänge an einem Problem fest, irgend wie brauche ich ein paar Anregungen. Ich habe eine weit verzweigte Datei- und Ordnerstruktur, deren Datei, bzw. Ordnernamen ungefähr diese Form haben (meistens)  AAAAAAA((BBBBBB))CCCCCCC.DDD, eventuell auch mal AAAA((BBBBB))CCCC((DDD)).EEE. Nun versuche ich ein Script zu schreiben, das diese Struktur abgrast und alle Datein, bzw. Ordner die ((BBB)) beinhalten um genau diesen Teil umbenennt, heisst alles was zwischen den Klammern steht, so vorhanden, incl. Klammern löscht. Bei Dateien und Ordnern. Die Namen sind von der länge untschiedlich.

    Hat jemand einen Gedankenanstoß für michi?

     

    Danke!

    Mittwoch, 2. März 2011 10:44

Antworten

  • Aha, so denke ich mal:

    $pfad = 'H:\'
    Get-ChildItem $pfad -Recurse | 
      ForEach-Object {
        if( $_.FullName -match "\(\((.*)\)\)")
        {
          echo "jap"
          $newName = $_.FullName -replace"\(\((.*)\)\)"
          Rename-Item $_.FullName $newName
        }
      }
    

    Irgendwie sind reguläre Ausdrücke komisch mit der PowerShell:) Also eigentlich nur die Methode Contains. Die reagiert anders als match.

     

    Egal, viel Spass und Gruss

    Mittwoch, 2. März 2011 15:16
  • Um falsche Matches zu verhindern, kannst du die Mustererkennung mit ".name" (nur Datei bzw. Ordnername) verbinden, statt mit ."fullname" (voller Pfadname).

    Ausserdem musst du verhindern, das versucht wird, ein Objekt in einem bereits umbenannten Pfad umzubenennen, da der Pfadname sich ja mittlerweile geändert hat und so der Befehl fehlschlägt.

    So sollte es gehen:

    function FNrename ($folder) {
     $items = dir $folder
    	foreach ($obj in $items) {
    		if( $obj.Name -match "\(\((.*)\)\)" ) {
    			$newName = $obj.Name -replace"\(\((.*)\)\)"
    			Rename-Item $obj.fullname $newName 
    		}
    	}
    	$items = dir $folder
    	foreach ($obj in $items) {
    		if ($obj.PSiscontainer) { FNrename $obj.fullname }
    	}
     
    }
    
    FNrename "j:\tmp"
    
    


    Das Funktion liest jeweils nur einen Ordner ein und benennt alle passenden Objekte um. Dann liest sie den Ordner erneut mit den neuen Namen ein, und führt die Funktion in allen vorhandenen Unterverzeichnissen aus...


    Grüße, Denniver


    http://bytecookie.wordpress.com/
    Donnerstag, 3. März 2011 14:16
    Moderator

Alle Antworten

  • Ich hoffe, das ist das was du suchst:

    $pfad = 'H:\'
    Get-ChildItem $pfad -Recurse | 
      ForEach-Object {
        if( $_.FullName.Contains("((BBB))"))
        {
          
          $newName = $_.FullName.Replace("((BBB))", "")
          Rename-Item $_.FullName $newName
        }
      }
    
    

    Bitte noch testen, habe es nur ganz kurz laufen lassen:)

    Gruss

    Raphi

    Mittwoch, 2. März 2011 12:51
  • Fast perfekt ;) danke. Aber der inhalt zwischen den Klammern ist variable, heisst: sobald Doppelklammern vorkommen, zwischen den Klammern löschen, incl Klammern, bei Dateien und Ordnern... :)
    Mittwoch, 2. März 2011 13:05
  • Aha, so denke ich mal:

    $pfad = 'H:\'
    Get-ChildItem $pfad -Recurse | 
      ForEach-Object {
        if( $_.FullName -match "\(\((.*)\)\)")
        {
          echo "jap"
          $newName = $_.FullName -replace"\(\((.*)\)\)"
          Rename-Item $_.FullName $newName
        }
      }
    

    Irgendwie sind reguläre Ausdrücke komisch mit der PowerShell:) Also eigentlich nur die Methode Contains. Die reagiert anders als match.

     

    Egal, viel Spass und Gruss

    Mittwoch, 2. März 2011 15:16
  • ja, so

    Das funktioniert, aber nicht wirklich, leider. Genau an der Stelle bin ich auch schon hängen geblieben. Warum? Ich schmeiss mal die Fehlermeldung rein:
     
    E:\export\User-37\(05)   W01 - W01G, General Business((Collection-34))\W0101_General((Collection-4794))\C_Competition((Collection-4796))\C06_f((Colle
    ction-4812))
    E:\export\User-37\(05)   W01 - W01G, General Business
    Rename-Item : Cannot rename because the target specified represents a path or device name.
    At C:\Documents and Settings\Rob\Desktop\filenamecleaner.ps1:10 char:18
    Obere Zeile ist der Eingangsname, untere der Ausgangsname. Offensichtlich holt er sich den kompletten Pfad, stolpert über die ersten Doppelklammern und will umbenennen. Korrekt wäre es wenn er in die unterste ebene wandert, erst die dateien und dann, wenn fertig die Ordner umbenennt.
    Wie gesagt, genau an der Stelle hing ich gestern fest... :(
    Donnerstag, 3. März 2011 10:04
  • Um falsche Matches zu verhindern, kannst du die Mustererkennung mit ".name" (nur Datei bzw. Ordnername) verbinden, statt mit ."fullname" (voller Pfadname).

    Ausserdem musst du verhindern, das versucht wird, ein Objekt in einem bereits umbenannten Pfad umzubenennen, da der Pfadname sich ja mittlerweile geändert hat und so der Befehl fehlschlägt.

    So sollte es gehen:

    function FNrename ($folder) {
     $items = dir $folder
    	foreach ($obj in $items) {
    		if( $obj.Name -match "\(\((.*)\)\)" ) {
    			$newName = $obj.Name -replace"\(\((.*)\)\)"
    			Rename-Item $obj.fullname $newName 
    		}
    	}
    	$items = dir $folder
    	foreach ($obj in $items) {
    		if ($obj.PSiscontainer) { FNrename $obj.fullname }
    	}
     
    }
    
    FNrename "j:\tmp"
    
    


    Das Funktion liest jeweils nur einen Ordner ein und benennt alle passenden Objekte um. Dann liest sie den Ordner erneut mit den neuen Namen ein, und führt die Funktion in allen vorhandenen Unterverzeichnissen aus...


    Grüße, Denniver


    http://bytecookie.wordpress.com/
    Donnerstag, 3. März 2011 14:16
    Moderator
  • dann wäre es aber hilfreich und zeitsparend gewesen, wenn du den bereits vorhandenen Code mitgegeben hättest:)
    Freitag, 4. März 2011 11:09