none
Numerischen Dateiname beim kopieren um 1 erhöhen RRS feed

  • Frage

  • Hallo zusammen,

    ich stehe mit meinen (bescheidenen) Scriptfähigkeiten vor einem Rätsel. Ich habe einen Datei welche im Namen die Versionsnummer trägt (datei_v01.txt) diese möchte ich zur weiteren Verarbeitung kopieren und als datei_v02.txt erstellen. Anbei mein Versuch dies zu realisieren. Problem dabei ist nur, es wird aus datei_v01.txt eine datei_v012.txt, danach eine v0123.txt. Es wird also nicht einfach hochgezählt sondern angefügt.

    Hat jemand einen Hinweis bevor ich mir weitere "Endloszahlen" generiere?

    $File = Get-ChildItem -Path "C:\Script\Test"
    $i=1
    Foreach ($f in $File) 
    { 
    Copy-Item $f.FullName ("C:\Script\Test\" + $f.BaseName + $i +".txt") 
    $i++
    }


    Dienstag, 17. Juli 2012 09:45

Antworten

  • Servus,

    so sollte es funktionieren:

    $file = Get-ChildItem -Path "C:\Script\Test"
    foreach ( $f in $file ) {
    	
    	[int32]$aktuelleVersion = $f.BaseName.Substring($f.BaseName.Length-2)
    	Copy-Item -Path $f.FullName -Destination ("C:\Script\Test\" + $f.BaseName.Replace($aktuelleVersion, "$($aktuelleVersion+1)") +".txt")
    }

    MfG
    Dienstag, 17. Juli 2012 11:14

Alle Antworten

  • Servus,

    so sollte es funktionieren:

    $file = Get-ChildItem -Path "C:\Script\Test"
    foreach ( $f in $file ) {
    	
    	[int32]$aktuelleVersion = $f.BaseName.Substring($f.BaseName.Length-2)
    	Copy-Item -Path $f.FullName -Destination ("C:\Script\Test\" + $f.BaseName.Replace($aktuelleVersion, "$($aktuelleVersion+1)") +".txt")
    }

    MfG
    Dienstag, 17. Juli 2012 11:14
  • Eine feste länge würde ich hier nicht nehmen !
    Was ist wenn der Zähler bei 100 angelangt ist ? Dann haut Length-2 nicht mehr hin !

    Dateien Hochzuzählen ist nicht einfach, da du immer die Zahl aus deinem Dateinamen erkennen bzw. herausschneiden musst und die Zahl in seiner länge variiert!

    Das Beste man "verpackt" die Zahl in Trennzeichen! z.B. Dateiname-12-.txt dann kann man leicht mit dem Operator -Split die Zahl "heraustrennen".

    Oder man benutzt Regex.
    http://powershell.com/cs/blogs/ebook/archive/2009/03/30/chapter-13-text-and-regular-expressions.aspx

    $Verzeichnis = "C:\Temp\test"
    $Dateiname = "datei_v01.txt"
    
    # Regex Filter festlegen: Zahlen in einem String finden
    $regex = [regex]'\d+'
    
    # Zahl extrahieren (Zahl ist hier noch ein String !)
    $Zahl = $regex.Match($Dateiname).Value
    
        
    # Zahl aus dem Dateinamen entfernen damit die Zahlen nicht hintereinander gehängt werden
    $NeuerDateiname = $Datei.Replace($Zahl,"") 
    
    # Zahl hochzählen (String mit Integer addieren, Zahl ist dann ein Integer !)
    $Zahl = 1 + [int]$Zahl
    
    
    # Die neue Zahl als String vor dem Punkt in den Dateinamen einfügen
    $NeuerDateiname = $NeuerDateiname.replace(".",([string]$Zahl + "."))
        
    # Neuen Dateinamen Anzeigen
    $NeuerDateiname   
        
    # Datei Kopieren
    Copy-Item (Join-Path $Verzeichnis $Dateiname) (Join-Path $Verzeichnis $NeuerDateiname)

    In deiner schleife sind das Eingabeverzeichniss und das aAsgabeverzeichniss gleich!!!!!
    Dies würde dazu führen, dass bei jedem Durchlauf, jede Datei hochgezählt und Kopiert wird !!

    Deshalb habe ich mein Beispiel nur mit einer Datei durchgeführt!

    Auch mein Regex Filter Arbeitet falsch wenn ein Dateiname mehrere Zahlen enthält! z.B. Datei12Name3.txt
    Besser ist es die Zahl mit Trennzeichen herauszuschneiden. Oder die länge des Dateinamens vor der Zahl zu benutzen!
    Sicherheit gibt es Nie!


    Please click “Mark as Answer” if my post answers your question and click Vote as Help if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als Hilfreich und Beiträge die deine Frage ganz oder teilweise beantwortet haben als Antwort.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '

    Dienstag, 17. Juli 2012 12:01
  • @ Peter:

    Ja, das Problem mit der festen Länge habe ich auch schon festgestellt, trifft mich aber ersteinmal nicht so schlimm. DAher hab ich das erstmal ignoriert...

    Trotzdem Danke für die Lösung.

    Mit der Bemerkung bzgl. Eingabeverzeichnis = Ausgabeverzeichnis hast du natürlich Recht. Ich habe allerdings die ebenfalls nur einen Ordner mit nur einer Datei zum testen gewählt. In der fertigen Version wird die entsprechende Datei durch eine Filterregel "gefunden" und dieses Object wird dann der Weiterverarbeitung übergeben...

    Freitag, 20. Juli 2012 19:10