mrbratwurst
Goto Top

Zeile 12 aus einer TXT-Datei auslesen und als Datei-Name für die TXT-Datei verwenden (für sämtliche TXT-Dateien in einem Verzeichnis!)

Hallo liebe Batch-Pros,

als Newbie stehe ich gerade vor der Aufgabe, dass ich in einem Verzeichnis mit Txt-Files (bzw. GPX-Files), welche einfach einen fortlaufenden Namen haben (1.txt, 2.txt,...) umd im Inhalt der Datei der eigentliche Namen der Datei steht, den Namen aus der Datei zu nehmen und die Datei umzubennen. Hört sich erstmal einfach an, aber ich bekomme es nicht gebacken face-plain. Was ich jetzt schon den halben Tag versuche ist, dass ich eine Schleife über alle Dateien in dem Verzeichnis zu machen (was auch geklappt hat (for %%f in ("*.gpx") do ( echo %%~f) --> alle Dateien werden aufgelistet), aber es scheitert dann daran die Stelle mit dem eigentlichen Dateinamen in der jeweiligen Datei auszulesen (und dann folgend diese Datei umzubenennen (quasi von 1.txt zu "Reise an die Ostsee.txt"). Da die Txt-Datei ein GPX-File ist gibt es hier auch eine "Struktur" (XML?!), jedoch bin ich hier gleich gnadelos gescheitert weshalb meine Idee bzw. Versuch gewesen ist, dass ich einfach immer die 12 Zeile auslese, da hier der Tag "<name>Reise an die Ostsee</name>" steht und ich dann vorne und hinten den Tag name einfach abschneide.

Aber wie schon gesagt, ich bin daran gescheitert in jede Datei in diesem Verzeichnis auf die Zeile 12 zuzugreifen --> Nachdem ich hier jetzt bei meiner Recherche auf einige Post von diesem Form gestoßen bin, aber ich damit nie ans Ziel gekommen bin stelle ich hier eine neu Frage :o ==> Ideen oder Vorschläge, wie ich das Problem lösen kann?

Umgebung: Windows 10

Auszug/Bsp aus der TXT-/GPX-File
<?xml version="1.0" encoding="utf-8"?><gpx creator="routenplaner Desktop App" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.routenplaner.com/xmlschemas/WaypointExtension/v1 http://www8.routenplaner.com/xmlschemas/WaypointExtensionv1.xsd http://www.routenplaner.com/xmlschemas/TrackPointExtension/v1 http://www.routenplaner.com/xmlschemas/TrackPointExtensionv1.xsd http://www.routenplaner.com/xmlschemas/GpxExtensions/v3 http://www8.routenplaner.com/xmlschemas/GpxExtensionsv3.xsd http://www.routenplaner.com/xmlschemas/ActivityExtension/v1 http://www8.routenplaner.com/xmlschemas/ActivityExtensionv1.xsd http://www.routenplaner.com/xmlschemas/AdventuresExtensions/v1 http://www8.routenplaner.com/xmlschemas/AdventuresExtensionv1.xsd http://www.routenplaner.com/xmlschemas/PressureExtension/v1 http://www.routenplaner.com/xmlschemas/PressureExtensionv1.xsd http://www.routenplaner.com/xmlschemas/TripExtensions/v1 http://www.routenplaner.com/xmlschemas/TripExtensionsv1.xsd http://www.routenplaner.com/xmlschemas/TripMetaDataExtensions/v1 http://www.routenplaner.com/xmlschemas/TripMetaDataExtensionsv1.xsd http://www.routenplaner.com/xmlschemas/ViaPointTransportationModeExtensions/v1 http://www.routenplaner.com/xmlschemas/ViaPointTransportationModeExtensionsv1.xsd http://www.routenplaner.com/xmlschemas/CreationTimeExtension/v1 http://www.routenplaner.com/xmlschemas/CreationTimeExtensionsv1.xsd http://www.routenplaner.com/xmlschemas/AccelerationExtension/v1 http://www.routenplaner.com/xmlschemas/AccelerationExtensionv1.xsd http://www.routenplaner.com/xmlschemas/PowerExtension/v1 http://www.routenplaner.com/xmlschemas/PowerExtensionv1.xsd http://www.routenplaner.com/xmlschemas/VideoExtension/v1 http://www.routenplaner.com/xmlschemas/VideoExtensionv1.xsd" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wptx1="http://www.routenplaner.com/xmlschemas/WaypointExtension/v1" xmlns:gpxtrx="http://www.routenplaner.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.routenplaner.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.routenplaner.com/xmlschemas/GpxExtensions/v3" xmlns:trp="http://www.routenplaner.com/xmlschemas/TripExtensions/v1" xmlns:adv="http://www.routenplaner.com/xmlschemas/AdventuresExtensions/v1" xmlns:prs="http://www.routenplaner.com/xmlschemas/PressureExtension/v1" xmlns:tmd="http://www.routenplaner.com/xmlschemas/TripMetaDataExtensions/v1" xmlns:vptm="http://www.routenplaner.com/xmlschemas/ViaPointTransportationModeExtensions/v1" xmlns:ctx="http://www.routenplaner.com/xmlschemas/CreationTimeExtension/v1" xmlns:gpxacc="http://www.routenplaner.com/xmlschemas/AccelerationExtension/v1" xmlns:gpxpx="http://www.routenplaner.com/xmlschemas/PowerExtension/v1" xmlns:vidx1="http://www.routenplaner.com/xmlschemas/VideoExtension/v1">  

  <metadata>
    <link href="http://www.routenplaner.com">  
      <text>routenplaner International</text>
    </link>
    <time>2017-08-22T20:25:18Z</time>
    <bounds maxlat="3232.551193976774812" maxlon="13.22682297155261" minlat="23.898009908" minlon="33.432455975562334" />  
  </metadata>

  <trk>
    <name>Reise an die Ostsee</name>
    <extensions>
      <gpxx:TrackExtension>
        <gpxx:DisplayColor>Blau</gpxx:DisplayColor>
      </gpxx:TrackExtension>
    </extensions>
    <trkseg>
      <trkpt lat="46.898988989" lon="18.707790011540055">  
        <ele>570</ele>
      </trkpt>
      <trkpt lat="66.551185008138418" lon="17.707915991544724">  
	  ...
	  ...

Content-Key: 384360

Url: https://administrator.de/contentid/384360

Printed on: April 25, 2024 at 22:04 o'clock

Member: NetzwerkDude
NetzwerkDude Aug 24, 2018 at 13:04:24 (UTC)
Goto Top
Man kann auch mit dem Teelöffel einen Tunnel graben...
Da es schon XML Dateien sind, nutze es auch! Denn die sind Strukturiert und können "komfortabel" eingelesen werden.

Dazu evtl. Internet Suche zu den Stichwort "Programmiersprache_deiner_Wahl + XML Einlesen"
Member: colinardo
colinardo Aug 24, 2018 updated at 14:00:04 (UTC)
Goto Top
Servus @MrBratwurst ,
GPX-File ist gibt es hier auch eine "Struktur" (XML?!)
Richtig, das ist eine XML konformes Textdatei und die sollte man auch so behandeln, also korrekterweise mit einem Parser den Wert extrahieren, eine "Zeilennummer" bringt dich da um Gottes Willen nicht weiter, also mach es gleich so:
@echo off
set "folder=D:\Reisetracks"  
powershell -Command "gci '%folder%' -Filter *.gpx | rename-item -NewName {\"$(([xml](gc $_.Fullname)).gpx.trk.name)$($_.Extension)\"} -Force -verbose"  
Grüße Uwe
Member: MrBratwurst
MrBratwurst Aug 24, 2018 updated at 14:40:49 (UTC)
Goto Top
Hallo Uwe,

wow, danke für die schnell Rückmeldung. Habe es auch gleich ausprobiert, dabei wird ein Fehler geworfen. Ich vermute, dass es hier ein Zugriffsproblem gibt, da zum einen der Name aus der Datei geholt wird und zugleich der Dateiname geändert werden soll. Deshalb wollte ich die Kommandozeile zu ändernt, dass aus dem Rename ein Copy wird bzw. die bestehende Datei mit dem neuen Namen angelegt wird. --> was ich aber nicht hin bekomme ist die Variable "Kopier-Quelle" zu setzen. Wenn ich direkt nach dem Copy-Item den Pfad zu einer Datei eintrage, dann funktioniert das Skript für diese eine Datei. Hast du hier noch einen Hinweis, was hier "...$_.Fullname + $_.Extension ..." nicht passt?

Fehler-Hinweis auf der Konsole:
Copy-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.

So habe ich das Komando jetzt angepasst:
powershell -Command "gci '%folder%' -Filter *.gpx | Copy-Item $_.Fullname + $_.Extension -Destination {\"$(([xml](gc $_.Fullname)).gpx.trk.name)$($_.Extension)\"} -Force -verbose"  


Besten Dank und Grüße
Member: colinardo
Solution colinardo Aug 24, 2018 updated at 14:55:39 (UTC)
Goto Top
dabei wird ein Fehler geworfen. Ich vermute, dass es hier ein Zugriffsproblem gibt, da zum einen der Name aus der Datei geholt wird und zugleich der Dateiname geändert werden soll.
Nein! Das sind separate Vorgänge da das Get-Content (gc) in Klammern steht.

Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.
Das geht so nicht, du brauchst die Kopier-Quelle nicht setzen die wird schon automatisch in der Pipe übernommen! Wenn nicht alle deine Dateien den Namen in der XML gesetzt haben kommt es natürlich zum Fehler weil der Zielname dann leer ist. Das kannst du aber abfangen mit einem Where-Object.
Hier die Variante mit Copy statt rename.
@echo off
set "folder=D:\Reisetracks"  
powershell -Command "gci '%folder%' -Filter *.gpx | ?{([xml](gc $_.Fullname)).gpx.trk.name -ne $null} | copy-item -Destination {\"%folder%\$(([xml](gc $_.Fullname)).gpx.trk.name)$($_.Extension)\"} -Force -verbose"  
Getestet, funktioniert einwandfrei.
Member: MrBratwurst
MrBratwurst Aug 24, 2018 at 15:17:12 (UTC)
Goto Top
colinardo, Hammer! Ich bin beeindruckt. Funktioniert opti. Muss noch ein String-Checker einbauen, da die Namen der Touren teilweise unerlaubte Zeichen für einen Dateinamen haben, aber das ist Schmuck am Nachthemd. Besten Danke colinardo. Cheers
Member: colinardo
Solution colinardo Aug 24, 2018 updated at 16:05:56 (UTC)
Goto Top
Muss noch ein String-Checker einbauen, da die Namen der Touren teilweise unerlaubte Zeichen für einen Dateinamen haben
Klar, so eine Funktion habe ich auch auf Lager:
function Replace-IllegalFilenameChars([parameter(ValueFromPipeline=$true)]$string,$replaceString='_'){  
   return ($string -replace"^(com[1-9]|lpt[1-9]|con|nul|prn|aux)$|[$(([System.IO.Path]::GetInvalidFileNameChars() | %{"\x"+([byte][char]$_).toString('X').PadLeft(2,"0")}) -join '')]",$replaceString)  
}
Member: rubberman
rubberman Aug 24, 2018 at 15:30:04 (UTC)
Goto Top
Zwei hab ich noch, Uwe.

conout$
conin$

Grüße
Steffen
Member: rubberman
rubberman Aug 25, 2018 at 11:24:12 (UTC)
Goto Top
@colinardo

Ich hab noch ein paar Tests mit deiner Funktion gemacht, Uwe. [1-9] deckt die 0 nicht mit ab, die aber lustigerweise auch zu einem invaliden Name führt. Und wenn du den invaliden Namen eine Dateiendung anhängst, bleiben sie invalid. Selbst so etwas wie com0.xyz.txt führt zum Fehler.
Vorschlag:
function Replace-IllegalFilenameChars([parameter(ValueFromPipeline=$true)]$string,$replaceString='_'){  
   return ($string -replace"^(com\d|lpt\d|con|nul|prn|aux|con(in|out)\x24)(?=$|\.)|[$(([System.IO.Path]::GetInvalidFileNameChars() | %{"\x"+([byte][char]$_).toString('X').PadLeft(2,"0")}) -join '')]",$replaceString)  
}

Grüße
Steffen
Member: colinardo
colinardo Aug 25, 2018 updated at 18:18:24 (UTC)
Goto Top
Zitat von @rubberman:

Zwei hab ich noch, Uwe.

conout$
conin$
Lassen sich hier zwar problemlos erstellen, genauso wie "com0.txt", warum auch immer (Microsoftsche Nachvollziehbarkeit) ...

Naja alles weitere darfst du dir gerne erweitern, war eh noch eine simple "alte" Funktion ohne Anspruch auf Vollständigkeit, denn es gibt noch ein paar weitere Spezialfälle.
Member: rubberman
rubberman Aug 25, 2018 at 18:40:00 (UTC)
Goto Top
Zitat von @colinardo:
Lassen sich hier zwar problemlos erstellen, genauso wie "com0.txt"
Nicht dass du denkst ich spinne (Win10)
com0_
conout_
Beide Male versucht eine Datei "test" umzubenennen. Funktioniert aber ebenso wenig, sie per Script erstellen zu wollen. Interessant ist dass sich Umleitungen zu conout$ im cmd Prompt ohne weiteres so verhalten wie der Ausgabestream.
prompt
Steffen
Member: colinardo
colinardo Aug 25, 2018 updated at 18:47:35 (UTC)
Goto Top
Nicht dass du denkst ich spinne (Win10)
Würde ich nie face-smile.
OK das com0.txt hat sich bei mir als Fehler herausgestellt, aber conout$ oder conin$ lässt sich trotzdem erstellen oder umbenennen ob Script oder über GUI (WIN7/WIN10):
screenshot
Aber die mit der Befehlszeile ist es hier das selbe Verhalten wie bei dir.
Member: rubberman
rubberman Aug 25, 2018 at 18:47:29 (UTC)
Goto Top
Witzig. Werde Montag mal auf ein paar Firmenrechnern testen...
Member: colinardo
colinardo Aug 25, 2018 updated at 19:23:00 (UTC)
Goto Top
Zitat von @rubberman:
Witzig.
Nicht wahr face-big-smile.

Zum Thema weitere Sachen die nicht gehen, probier mal die Exponenten:
com².txt
oder
com³.txt
bzw.
com²
bzw.
com³

Zahl oder Zahl das ist hier die Frage face-big-smile. Aus Sicht eines Mathematikers JA, aus ASCII Sicht NEIN.
Member: rubberman
rubberman Aug 25, 2018 at 18:56:37 (UTC)
Goto Top
Das ist ja noch verrückter. Keine Zahl, ganz klar. Selbst die Fehlermeldung habe ich in dem Zusammenhang nie gesehen.
comquadrat
Member: rubberman
rubberman Aug 27, 2018 at 16:50:49 (UTC)
Goto Top
Nur um noch Feedback zu geben
Zitat von @rubberman:
Werde Montag mal auf ein paar Firmenrechnern testen...
Hab ich gemacht. Auf 3 Maschinen, Win7 und Win10. Ich habe keine Ahnung wie du es geschafft hast, Uwe. Ich hab jedenfalls keine Möglichkeit gefunden Dateien namens conin$ oder conout$ zu erstellen. Weder im Explorer, noch per VBScript oder Powershell.

Steffen