none
Umbenennen von html-Dateien anhand ihres title-tags in Unterordnern, ps3, Win7 RRS feed

  • Frage

  • Die index.html sind in Unterverzeichnissen (Tiefe 1) von "c:\data\" jeweils einmal zu finden. Sie haben dieses Namens-Muster: 20180827194705341.
    Der title-tag hat folgendes Muster: z. B. <title>Liste von Sehenswürdigkeiten in Berlin – Wikipedia</title>
    Ich möchte nun jede index.html rekursiv mit dem title-tag umbenennen bzw. diesen voranstellen, z. B. aus index.html möge Liste von Sehenswürdigkeiten in Berlin – Wikipedia_index.html werden.

    Mein Lösungsansatz sieht so aus:

    $data = Get-ChildItem -Path c:\data\ -Recurse -Include index.html | select-string -PATTERN "(?<=<title>)([\S\s]*?)(?=</title>)"
    $data | get-member #check the methods and properties available using Get-Member
    $data.Matches #siehe unten
    $data.Filename #siehe unten
    $data | rename-Item -WhatIf $data.Filename -NewName $data.Matches

    Leider bricht der rename-Vorgang mit einer Fehlermeldung ab:
    Rename-Item : "System.Object[]" kann nicht in den Typ "System.String" konvertiert     
    werden, der für den Parameter "NewName" erforderlich ist. Die angegebene Methode wird
    nicht unterstützt.

    Vielen Dank.

    Output von der Powershell:

       TypeName: Microsoft.PowerShell.Commands.MatchInfo

    Name         MemberType Definition
    ----         ---------- ----------
    Equals       Method     bool Equals(System.Object obj)
    GetHashCode  Method     int GetHashCode()
    GetType      Method     type GetType()
    RelativePath Method     string RelativePath(string directory)
    ToString     Method     string ToString(), string ToString(string directory)
    Context      Property   Microsoft.PowerShell.Commands.MatchInfoContext Context {get;set;}
    Filename     Property   string Filename {get;}
    IgnoreCase   Property   bool IgnoreCase {get;set;}
    Line         Property   string Line {get;set;}
    LineNumber   Property   int LineNumber {get;set;}
    Matches      Property   System.Text.RegularExpressions.Match[] Matches {get;set;}
    Path         Property   string Path {get;set;}
    Pattern      Property   string Pattern {get;set;}
    ---------------------------------------------------------------
    Groups   : {Liste von Sehenswürdigkeiten in Berlin – Wikipedia, Liste von
               Sehenswürdigkeiten in Berlin – Wikipedia}
    Success  : True
    Captures : {Liste von Sehenswürdigkeiten in Berlin – Wikipedia}
    Index    : 7
    Length   : 50
    Value    : Liste von Sehenswürdigkeiten in Berlin – Wikipedia
    --------------------------------------------------------------
    Groups   : {Bodeneffekt – Wikipedia, Bodeneffekt – Wikipedia}
    Success  : True
    Captures : {Bodeneffekt – Wikipedia}
    Index    : 7
    Length   : 23
    Value    : Bodeneffekt – Wikipedia
    -------------------------------------------------------------
    index.html
    index.html
    ---------------------------------------------------------------
    Rename-Item : "System.Object[]" kann nicht in den Typ "System.String" konvertiert
    werden, der für den Parameter "NewName" erforderlich ist. Die angegebene Methode wird
    nicht unterstützt.

    ============================================================

    ============================================================

    Vielen Dank für die Hinweise, Evgenij Smirnov.

    Die Lösung ist:

    $data | ForEach-Object { rename-item -WhatIf $($_.Path) -NewName "$($_.matches.captures)_$($_.Filename)" }

    Da ich kaum Erfahrung im Programmieren habe (bis auf etwas batch-Frickelei) freue ich mich sehr.

    Hilfreich war nach

    $($data.Matches[0].Captures[0])
    schließlich:
    $data | ForEach-Object {"groups is $($_.matches.groups[1]) + value is $($_.matches.value) + captures is $($_.matches.captures) + path is $($_.Path) + filenameMitCodeblock is $($_.Filename) + filename is $_.Filename"}
    Aufgrund dessen bin ich auf die Verwendung von .Path gekommen.



    • Bearbeitet m.abels Sonntag, 9. Dezember 2018 16:10
    Samstag, 8. Dezember 2018 16:12

Antworten

  • Moin,

    die Fehlermeldung ist doch ziemlich unmissverständlich: Für den neuen Namen brauchst Du einen String und lieferst stattdessen ein Array von [MatchInfo]. Es gibt keine kanonische Methode, ein Array von [MatchInfo] in einen String zu übersetzen, daher die Fehlermeldung.

    Wenn Du dir sicher bist (bei ordentlichen HTML-Dateien sollte das hinkommen), dass es immer nur einen Match gibt, kannst Du statt $data.Matches einfach das erste Element $data.Matches[0] nehmen. Das ist aber immer noch vom Typ [MatchInfo]. Dann musst Du halt die Property suchen, die den gewünschten Wert enthält, und diese zum Umbenennen nutzen. das wäre dann sowas wie "$($data.Matches[0].Captures[0]).html", schätze ich.


    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> https://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com


    In theory, there is no difference between theory and practice. In practice, there is.

    • Als Antwort markiert m.abels Sonntag, 9. Dezember 2018 15:57
    Samstag, 8. Dezember 2018 16:54