Jump to content

PowerShell Dateiname vergleichen und umbenennen


Direkt zur Lösung Gelöst von awe,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo zusammen

ich bin dabei mir ein PowerShell skript zu basteln welches prüft ob Dateien in einem Ordner die Zeichenfolge "20200720" vorangestellt haben, falls nicht sollte dies vorangestellt werden, also der Dateiname sollte dann "20200720_datei.ods" aussehen. Das Thema PowerShell skript ist für mich noch relativ neu und ich habe mir jetzt mittels viel Nachlese und codebeispielen folgenden Code zusammengebastelt: 

 

$filename Get-ChildItem -Name 

if($filename -ne "20200720*" 
{
rni $_.ToString("20200720") + "_" + $_.Name
}

wenn ich das Script ausführe rührt sich gar nichts - da komme ich jetzt nicht weiter....

Passt der Vergleichsoperator -ne hier nicht, oder mag der keine Wildcats?

 

Vielleicht hat jemand einen Hinweis für mich

 

thx

Link zu diesem Kommentar

Hi,

 

da fehlt einiges und am meisten wohl Grundlagen in Scripting/Programmierung bzw. PowerShell.

 

Schau dir doch als erstes einmal an was ein "Get-ChildItem -Name" liefert und prüfe, ob da neben Dateien auch Ordner bei sind. Da du scheinbar nur *.ods Files möchtest, könntest du dir den "-Filter" Parameter ansehen. Ebenfalls wirst du am "Where" Statement nicht vorbeikommen, um Ordner auszuschließen bzw. mit der "StartsWith()" Funktion den Anfang des Dateinamens zu prüfen.

 

Sobald du die passende Code-Zeile hast, schauen wir weiter ;).

 

Gruß

Jan

Link zu diesem Kommentar
vor 1 Minute schrieb awe:

Passt der Vergleichsoperator -ne hier nicht, oder mag der keine Wildcats?

 

Microsoft | About Comparison Operators

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-7

 

Du musst den Parameter "-like" benutzen, weil dieser für Strings und nicht für Objekte ist.

Link zu diesem Kommentar

Danke für die Tipps, ich habe den code nun wiefolgt umgebaut:

 

$filename Get-ChildItem -Filter *.ods -Recurse 
$auswahl Where-Object -NotLike $filename.StartsWith("20200720")

rni $auswahl.ToString("20200720") + "_" + $_.Name

Meine Überlegung:

mit Zeile 1 selektiere ich alle .ods files (auch in den Unterordnern) und speichere diese in der Variable $filename

die Variable $auswahl soll dann aus der Variable $filename alle dateinamen speichern die nicht mit 20200720 beginnen

diesen Dateinamen würde ich dann 20200720_ voranstellen

 

bearbeitet von awe
Link zu diesem Kommentar

sorry, da gabs jetzt irgendein anderes Problem.

Natürlich kommt ein Fehler:

Unerwartetes Token "Get-ChildItem" in Ausdruck oder Anweisung.
In C:\Users\xxxx\ren_script_5.ps1:2 Zeichen:10
+ $auswahl Where-Object -NotLike $filename.StartsWith("20200720")
+          ~~~~~~~~~~~~
Unerwartetes Token "Where-Object" in Ausdruck oder Anweisung.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

was sagt das "unerwartete token" aus?

 

Link zu diesem Kommentar

ui ja danke - habs gleich korrigiert

jetzt kommt

Fehler beim Aufrufen der Methode, da [System.IO.FileInfo] keine Methode mit dem Namen "startswith" enthält.
In C:\Users\ren_script_5.ps1:2 Zeichen:1
+ $auswahl = Where-Object -NotLike $filename.StartsWith("20200720")
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Users\ren_script_5.ps1:4 Zeichen:1
+ rni $auswahl.ToString("20200720") + "_" + $_.Name
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

OK danke - ich lese mich da nochmal mal ein

bearbeitet von awe
Link zu diesem Kommentar
  • Beste Lösung

Hallo

der vollständigkeit halber möchte ich hier noch meine funktionierende Lösung welche ich nun zusammengebastelt habe teilen: 

Get-ChildItem -Path C:\Users\xxxxxx -Recurse -Exclude [0-9]* -Filter *.ods |
    foreach { Rename-Item $_.FullName ($_.CreationTime.ToString("yyyy-MM-dd") + "_" + $_.Name)}

Vielen Dank für eure Tipps

Link zu diesem Kommentar
vor 15 Stunden schrieb awe:

Hallo

der vollständigkeit halber möchte ich hier noch meine funktionierende Lösung welche ich nun zusammengebastelt habe teilen: 


Get-ChildItem -Path C:\Users\xxxxxx -Recurse -Exclude [0-9]* -Filter *.ods |
    foreach { Rename-Item $_.FullName ($_.CreationTime.ToString("yyyy-MM-dd") + "_" + $_.Name)}

Vielen Dank für eure Tipps

Theoretisch, bzw. wenn ich es richtig verstanden habe, schließt du hier zu viel aus. Eine Datei "1Test.ods" würde bspw. durchrutschen.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...