Benutzer mit den meisten Antworten
Dateiname ergänzen

Frage
-
Hallo Powershell Profis,
Ich bin noch ein Powershell Anfänger und habe folgendes Problem:
In einen Ordner stehen mehrere Dateien die wie folgt benannt sind:
AAAAAAA_YYYYMMDDssmmhh.pdf
BBBBBBB_YYYYMMDDssmmhh.pdf
...Ich möchte an den Dateinamen einen fixen Namen anfügen also
DDDD_AAAAAAA_YYYYMMDDssmmhh.pdf
DDDD_BBBBBBB_YYYYMMDDssmmhh.pdf
...
Fürs erste habe ich das so hinbekommen, aber ab der geschwungenen Klammer muss ich aussteigen:Get-ChildItem C:\Test\*.txt | rename-item -NewName {$_.name
vielleicht könntet ihr mir da weiterhelfen.
vielen Dank im Voraus
Antworten
-
Die PowerShell Pipeline wird mit dem | Zeichen erstellt.
Get-ChildItem holt immer eine Datei (oder Ordner) und erzeugt von der Datei ein .NET Objekt vom Typ FileInfo.
Jede einzelne Datei wird dann sofort nach dem Erzeugen an die Pipeline weitergegeben.
Ein folgendes Cmdlet kann die Objekte, die von der Pipeline kommen meist direkt weiterverarbeiten.
Genau für diese einfache Pipeline Anwendung wurde PowerShell gebaut.
Da du aber auf den Dateinamen zugreifen möchtest, um diesen zu verarbeiten, musst du noch einen Schritt weitergehen.
Eine Sache fehlt noch in deinem Code, das ist das ForEach-Object Cmdlet.
In dem Moment wo das FileInfo Objekt über den Zaun | geschmissen wird, landet es in der Variable mit dem seltsamen Namen Dollar-Unterstrich $_
Ein Objekt ist ein Behälter der Daten enthält die mit einem Namen angesprochen werden können. Diese Daten heißen Properties (Einzahl: Property).
Name = Wert
Um von einem Objekt bestimmte Daten abzufragen benutzt man den Punkt . als Pfad Operator.
Nun kann man von dem FileInfo Objekt den Wert des Dateinames mit dem Namen:"Name" abrufen und den Vollen Pfad zur Datei Pfad mit dem Namen:"Fullname".
(Dies kann man mit dem Cmdlet Get-Member herausfinden oder mit Select-Object *)
Eine Sache Fehlt noch in deinem Code und das ist das ForEach-Object Cmdlet. Das ForEach-Object Cmdlet wird benutzt um für jedes Objekt, dass über die Pipeline angeliefert wird Aktionen auszuführen.
Die geschweiften Klammern bestimmen, wo die Aktion von ForEach-Object { beginnt, und wo sie endet }.
Diese geschweiften Klammern nennt man Scriptblock, da man innerhalb dieser Klammern ein ganzes Script oder auch nur einen einzigen Befehl schreiben kann.
Schau dir mal auf Youtube meine Videos dazu an!
# Test Code zu Anzeige der neuen Namen Get-ChildItem E:\Temp\*.txt | ForEach-Object {"DDDD_" + $_.name} # Kommentarzeichen entfernen um die Dateien wirklich umzubenennen # Get-ChildItem C:\Test\*.txt | ForEach-Object {Rename-Item $_ -NewName ("DDDD_" + $_.name)}
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 vorgeschlagen brima Donnerstag, 20. März 2014 08:33
- Bearbeitet Peter Kriegel Donnerstag, 20. März 2014 08:46
- Als Antwort markiert berni3487 Donnerstag, 20. März 2014 11:32
Alle Antworten
-
Die PowerShell Pipeline wird mit dem | Zeichen erstellt.
Get-ChildItem holt immer eine Datei (oder Ordner) und erzeugt von der Datei ein .NET Objekt vom Typ FileInfo.
Jede einzelne Datei wird dann sofort nach dem Erzeugen an die Pipeline weitergegeben.
Ein folgendes Cmdlet kann die Objekte, die von der Pipeline kommen meist direkt weiterverarbeiten.
Genau für diese einfache Pipeline Anwendung wurde PowerShell gebaut.
Da du aber auf den Dateinamen zugreifen möchtest, um diesen zu verarbeiten, musst du noch einen Schritt weitergehen.
Eine Sache fehlt noch in deinem Code, das ist das ForEach-Object Cmdlet.
In dem Moment wo das FileInfo Objekt über den Zaun | geschmissen wird, landet es in der Variable mit dem seltsamen Namen Dollar-Unterstrich $_
Ein Objekt ist ein Behälter der Daten enthält die mit einem Namen angesprochen werden können. Diese Daten heißen Properties (Einzahl: Property).
Name = Wert
Um von einem Objekt bestimmte Daten abzufragen benutzt man den Punkt . als Pfad Operator.
Nun kann man von dem FileInfo Objekt den Wert des Dateinames mit dem Namen:"Name" abrufen und den Vollen Pfad zur Datei Pfad mit dem Namen:"Fullname".
(Dies kann man mit dem Cmdlet Get-Member herausfinden oder mit Select-Object *)
Eine Sache Fehlt noch in deinem Code und das ist das ForEach-Object Cmdlet. Das ForEach-Object Cmdlet wird benutzt um für jedes Objekt, dass über die Pipeline angeliefert wird Aktionen auszuführen.
Die geschweiften Klammern bestimmen, wo die Aktion von ForEach-Object { beginnt, und wo sie endet }.
Diese geschweiften Klammern nennt man Scriptblock, da man innerhalb dieser Klammern ein ganzes Script oder auch nur einen einzigen Befehl schreiben kann.
Schau dir mal auf Youtube meine Videos dazu an!
# Test Code zu Anzeige der neuen Namen Get-ChildItem E:\Temp\*.txt | ForEach-Object {"DDDD_" + $_.name} # Kommentarzeichen entfernen um die Dateien wirklich umzubenennen # Get-ChildItem C:\Test\*.txt | ForEach-Object {Rename-Item $_ -NewName ("DDDD_" + $_.name)}
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 vorgeschlagen brima Donnerstag, 20. März 2014 08:33
- Bearbeitet Peter Kriegel Donnerstag, 20. März 2014 08:46
- Als Antwort markiert berni3487 Donnerstag, 20. März 2014 11:32