none
Zusatz an Dateiname anhängen RRS feed

  • Frage

  • Guten Morgen,

    ich würde gern einen Ordner mit Dateien auslesen, und an das Ender der Datei eine gleiche Zeichenfolge schreiben. Leider habe ich keinen Weg gefunden einen Dateinamen so zu bearbeiten

    [String] $path = "C:\...\Ordner"

    Get-Childitem -path $path | Rename-Item -NewName {$_.Name -replace 'aktuellenDateinamen','aktuellenDateinamen+zeichenfolge'}

    Kann dies so in der Art realisiert werden? Über eine kurze Hilfestellung würde ich mich freuen.

    Viele Grüße

    Marius

    Freitag, 6. Februar 2015 07:31

Antworten

  • Mahlzeit Marius! ;-)

    1.)
    Ein Datei Objekt hat in PowerShell mehrere Namens Komponenten die du nutzen kannst

    • Fullname: ist der volle Pfad zur Datei
    • Name: ist der Name der Datei, ohne Pfad, mit Dateierweiterung (.exe, .txt usw...)
    • Basename: ist der Dateiname, ohne Extension und ohne Pfad.
    • Extension: ist die Dateierweiterung mit Punkt (.exe, .txt usw...)

    2.)
    -replace benutzt Regular Expressions deshalb muss man hir eventuelle Sonderzeichen in den Dateinamen Maskieren (escapen).

    3.)
    Du benutzt die Anführungszeichen nicht richtig. Lies dazu mal in der PowerShell Hilfe das Thema about_Quoting_Rules:

    http://www.colorconsole.de/PS_Windows/de/about_Quoting_Rules.htm

    $path = 'C:\...\Ordner'
    $Ersetzung = 'NEUEZEICHENFOLGE'
    
    Get-Childitem -path $path | Rename-Item -NewName {$_.Name -replace ([System.Text.RegularExpressions.Regex]::Escape($_.Basename)),"$($_.Basename)$Ersetzung"} -WhatIf



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort markiert Marius El Freitag, 6. Februar 2015 12:38
    Freitag, 6. Februar 2015 12:00
  •  

    Ja, das geht fast genau so. Erklärungen in-line:

    [String] $path = "D:\tmp\test"
    $newstring = "_ABC"
    
    # Dateien Auslesen, Folder filtern
    $Files = Get-Childitem -path $path  | Where-Object { !$_.PSIsContainer } 
    
    foreach ($file in $files) {
           # Neuen Namen zusammenbauen (Basename = Dateiname ohne extension)
    	$newname = $file.basename + $newstring + $file.Extension
           # Umbenennen  
    	Rename-Item -Path $File.fullname -NewName $newname -WhatIf
    }

    #
    # und das Gleiche nochmal als Einzeiler
    #
     GCI $path  | ? { !$_.PSIsContainer } | % { Rename-Item $_.fullname ($_.basename + $newstring + $_.Extension) -WhatIf }


     
    Wenn das Ergebnis zufriedenstellend ist, kannst du den -whatif Schalter entfernen.
     
    Grüße, Denniver


    Freitag, 6. Februar 2015 12:03
    Moderator

Alle Antworten

  • Mahlzeit Marius! ;-)

    1.)
    Ein Datei Objekt hat in PowerShell mehrere Namens Komponenten die du nutzen kannst

    • Fullname: ist der volle Pfad zur Datei
    • Name: ist der Name der Datei, ohne Pfad, mit Dateierweiterung (.exe, .txt usw...)
    • Basename: ist der Dateiname, ohne Extension und ohne Pfad.
    • Extension: ist die Dateierweiterung mit Punkt (.exe, .txt usw...)

    2.)
    -replace benutzt Regular Expressions deshalb muss man hir eventuelle Sonderzeichen in den Dateinamen Maskieren (escapen).

    3.)
    Du benutzt die Anführungszeichen nicht richtig. Lies dazu mal in der PowerShell Hilfe das Thema about_Quoting_Rules:

    http://www.colorconsole.de/PS_Windows/de/about_Quoting_Rules.htm

    $path = 'C:\...\Ordner'
    $Ersetzung = 'NEUEZEICHENFOLGE'
    
    Get-Childitem -path $path | Rename-Item -NewName {$_.Name -replace ([System.Text.RegularExpressions.Regex]::Escape($_.Basename)),"$($_.Basename)$Ersetzung"} -WhatIf



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort markiert Marius El Freitag, 6. Februar 2015 12:38
    Freitag, 6. Februar 2015 12:00
  •  

    Ja, das geht fast genau so. Erklärungen in-line:

    [String] $path = "D:\tmp\test"
    $newstring = "_ABC"
    
    # Dateien Auslesen, Folder filtern
    $Files = Get-Childitem -path $path  | Where-Object { !$_.PSIsContainer } 
    
    foreach ($file in $files) {
           # Neuen Namen zusammenbauen (Basename = Dateiname ohne extension)
    	$newname = $file.basename + $newstring + $file.Extension
           # Umbenennen  
    	Rename-Item -Path $File.fullname -NewName $newname -WhatIf
    }

    #
    # und das Gleiche nochmal als Einzeiler
    #
     GCI $path  | ? { !$_.PSIsContainer } | % { Rename-Item $_.fullname ($_.basename + $newstring + $_.Extension) -WhatIf }


     
    Wenn das Ergebnis zufriedenstellend ist, kannst du den -whatif Schalter entfernen.
     
    Grüße, Denniver


    Freitag, 6. Februar 2015 12:03
    Moderator