Batch TXT Datei durchsuchen, Token vergleichen, bei Erfolg Variable setzen
Hallo Gemeinde,
ich habe ein Problem und habe auch eine Lösung im Kopf, nur will die leider nicht funktionieren. Ausgangslage ist folgende:
Ich habe eine Textdatei in der folgender String vorhanden sein kann (Jede Zeile jetzt wäre eine eigene Textdatei, es ist immer nur eine Zeile vorhanden)
Beispiele:
E-AC3, 5.1 channels, 0:01:00, 768kbps, 48kHz, dialnorm: -28dB
TrueHD (Atmos), 7.1 channels, 48kHz, dialnorm: -27dB
usw.
Den Wert den ich am Ende immer gerne als Variable hätte wäre die Dialnorm als Zahl, also in dem Falle oben 28, 27.
Leider kann ich nicht einfach mit einer FOR Schleife "," als Delimeter nehmen und mir immer den dritten Token oder so abgreifen, weil dialnorm immer an anderer Position ist (falls es hilfreich ist oder das ganze vereinfacht, es ist immer der letzte Token nach dem Delimeter ",", danach kommt nichts mehr). Meine Idee war jetzt, "," und ":" als Delimeter zu setzen und dann mehrere Token zu vergleichen. Der Code dazu sieht so aus:
Die Ausgabe ist immer UNKNOWN.
Ich bin leider völlig ratlos wo der Fehler sitzt :/. Für den Fingerzeig bedanke ich mich. Es muss auch keine Lösung bis ins kleinste Detail sein, wenn er mir alles nach dem dialnorm: als Variable setzt, cutte ich mir das zurecht .
ich habe ein Problem und habe auch eine Lösung im Kopf, nur will die leider nicht funktionieren. Ausgangslage ist folgende:
Ich habe eine Textdatei in der folgender String vorhanden sein kann (Jede Zeile jetzt wäre eine eigene Textdatei, es ist immer nur eine Zeile vorhanden)
Beispiele:
E-AC3, 5.1 channels, 0:01:00, 768kbps, 48kHz, dialnorm: -28dB
TrueHD (Atmos), 7.1 channels, 48kHz, dialnorm: -27dB
usw.
Den Wert den ich am Ende immer gerne als Variable hätte wäre die Dialnorm als Zahl, also in dem Falle oben 28, 27.
Leider kann ich nicht einfach mit einer FOR Schleife "," als Delimeter nehmen und mir immer den dritten Token oder so abgreifen, weil dialnorm immer an anderer Position ist (falls es hilfreich ist oder das ganze vereinfacht, es ist immer der letzte Token nach dem Delimeter ",", danach kommt nichts mehr). Meine Idee war jetzt, "," und ":" als Delimeter zu setzen und dann mehrere Token zu vergleichen. Der Code dazu sieht so aus:
set "ATMOS_DIALNORM=UNKNOWN"
for /F "usebackq tokens=1* delims=,:" %%A in ("!TEMP_FOLDER!\DialNorm.txt") do if " dialnorm"=="%%A" set "ATMOS_DIALNORM=%%B"
echo !ATMOS_DIALNORM!
Die Ausgabe ist immer UNKNOWN.
Ich bin leider völlig ratlos wo der Fehler sitzt :/. Für den Fingerzeig bedanke ich mich. Es muss auch keine Lösung bis ins kleinste Detail sein, wenn er mir alles nach dem dialnorm: als Variable setzt, cutte ich mir das zurecht .
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 21766334053
Url: https://administrator.de/contentid/21766334053
Ausgedruckt am: 22.11.2024 um 02:11 Uhr
4 Kommentare
Neuester Kommentar
Hi,
Mir ist immer weniger klar bzw. mir wird mehr und mehr unklar, warum man sich heutzutage noch mit Batch abmüht. In Powershell wäre das ein ...3-Zeiler, wenn man die Pipe verwendet und die richtigen Funktionen kennt.
Auf die Schnelle habe ich das gefunden. Sollte deinen UseCase abdecken:
Powershell select-string -pattern
Vielleicht setze ich mich später noch hin und liefere dir ein Beispiel das genau zu deiner Frage passt.
Grüße
EDIT:
Inhalt der fiktivenTextdatei:
und so schaut das PS1 aus (kann natürlich noch verfeinert werden):
Mir ist immer weniger klar bzw. mir wird mehr und mehr unklar, warum man sich heutzutage noch mit Batch abmüht. In Powershell wäre das ein ...3-Zeiler, wenn man die Pipe verwendet und die richtigen Funktionen kennt.
Auf die Schnelle habe ich das gefunden. Sollte deinen UseCase abdecken:
Powershell select-string -pattern
Vielleicht setze ich mich später noch hin und liefere dir ein Beispiel das genau zu deiner Frage passt.
Grüße
EDIT:
Inhalt der fiktivenTextdatei:
E-AC3, 5.1 channels, 0:01:00, 768kbps, 48kHz, dialnorm: -21dB
TrueHD (Atmos), 7.1 channels, 48kHz, dialnorm: -45dB
E-AC3, dialnorm: -28dB, 5.1 channels, 0:01:00, 768kbps, 48kHz
TrueHD (Atmos), 7.1 channels, 48kHz, dialnorm: -45dB
E-AC3, dialnorm: -29dB, 5.1 channels, 0:01:00, 768kbps, 48kHz
E-AC3, 5.1 channels, 0:01:00, 768kbps, dialnorm: -21dB, 48kHz
TrueHD (Atmos), 7.1 channels, 48kHz, dialnorm: -27dB
und so schaut das PS1 aus (kann natürlich noch verfeinert werden):
$data = Get-Content -Path "C:\Dummy.txt"
$result = @()
$data | % {
<#
$result += [Regex]::Match($_, "(dialnorm: -\d{1,3}dB)", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase).Value
oder
$result += $_
oder
...
...
...
#>
[Regex]::Match($_, "(dialnorm: -\d{1,3}dB)", [System.Text.RegularExpressions.RegexOptions]::IgnoreCase).Value
}
Zitat von @Kriegstreiber:
Vielen Dank für deine Mühe, allerdings möchte ich ungerne PS1 Scripts aus der Batch laden.
Das wäre auch absolutern Nonsense. Man ersetzt normalerweise die veraltete Technologie mit der neueren und pfrimelt die neuer nicht in die alte rein 😉Vielen Dank für deine Mühe, allerdings möchte ich ungerne PS1 Scripts aus der Batch laden.
Aber - wenn man deine Fragen so anschaut - dann sieht man, dass du auf 40+ Jahre alte Technologie stehst. 🤷♂️
Geht auch old-school.
Steffen
:: gesamte Zeile lesen
<"!TEMP_FOLDER!\DialNorm.txt" set /p "line="
ECHO !line!
:: letzte 16 Zeichen abzüglich "db" am Ende, also 14 Zeichen was in jedem Fall ausreichen müsste
set "line=!line:~-16,-2!"
ECHO !line!
:: alles vor und inklusive Doppelpunkt wegschneiden und den Rest versuchen numerisch auszuwerten
set /a "num=!line:*:=!"
ECHO !num!
Steffen