kriegstreiber
Goto Top

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:

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 face-smile.

Content-Key: 21766334053

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

Printed on: April 28, 2024 at 06:04 o'clock

Member: mayho33
mayho33 Oct 27, 2023 updated at 18:25:17 (UTC)
Goto Top
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:
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  
}
Member: Kriegstreiber
Kriegstreiber Oct 27, 2023 at 18:28:08 (UTC)
Goto Top
Vielen Dank für deine Mühe, allerdings möchte ich ungerne PS1 Scripts aus der Batch laden. Einen kleinen Teilerfolg habe ich bereits, aber da gibt es bestimmt noch DIE Masterlösung die hier jemand hat:

for /F "usebackq tokens=1-10 delims=,:" %%A in ("!TEMP_FOLDER!\DialNorm.txt") do (  
	if " dialnorm"=="%%A" set ATMOS_DIALNORM=%%B  
	if " dialnorm"=="%%B" set ATMOS_DIALNORM=%%C  
	if " dialnorm"=="%%C" set ATMOS_DIALNORM=%%D  
	if " dialnorm"=="%%D" set ATMOS_DIALNORM=%%E  
	if " dialnorm"=="%%E" set ATMOS_DIALNORM=%%F  
	if " dialnorm"=="%%F" set ATMOS_DIALNORM=%%G  
	if " dialnorm"=="%%G" set ATMOS_DIALNORM=%%H  
	if " dialnorm"=="%%H" set ATMOS_DIALNORM=%%I  
	if " dialnorm"=="%%I" set ATMOS_DIALNORM=%%J  
	if " dialnorm"=="%%J" set ATMOS_DIALNORM=%%K	  
)
set "ATMOS_DIALNORM=!ATMOS_DIALNORM:~2,2!"  
echo !ATMOS_DIALNORM!
Member: mayho33
mayho33 Oct 27, 2023 updated at 18:35:55 (UTC)
Goto Top
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 😉
Aber - wenn man deine Fragen so anschaut - dann sieht man, dass du auf 40+ Jahre alte Technologie stehst. 🤷‍♂️
Member: rubberman
rubberman Oct 27, 2023 at 18:36:44 (UTC)
Goto Top
Geht auch old-school.
:: 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