2017-11-29 4 views
0

Ich versuche, einen numerischen Wert aus einer ffmpeg-Ausgabe auszugeben und ihn einer Textdatei hinzuzufügen.Suchen Sie einen Wert in einem String und geben Sie ihn über eine Batch-Datei in eine Textdatei aus.

Ich möchte es als eine einzige Zeile aus einer Batch-Datei ausführen, wo ich alle meine Variablen bereits eingerichtet habe, aber ich bin mir nicht sicher, ob es überhaupt möglich ist.

Dies ist die Ausgabezeichenfolge, von wo aus ich will den average Wert kopieren:

[Parsed_psnr_0 @ 0000000003763ec0] PSNR y:18.250891 u:33.358190 v:36.566447 average:19.962586 min:11.944585 max:41.255356 

In diesem Fall 19.962586, ich habe mehr hundert Dateien zu verarbeiten und die Zahl ist immer anders.

Hier ist ein schwacher Versuch, aus Unwissenheit zu tun, dass:

powershell Get-Content -Path "'D:\work folder\test.txt'" | -match 'average:(.+?) min:' | Out-File -Path "D:\work folder\test_result.txt" 

nicht funktioniert und auch nicht die 100 Variationen Ich habe versucht, aber ich habe es als eine grobe Vorstellung davon enthalten, was ich versuche.

+0

Sie können auch den Durchschnittswert mit reinem Batch-Datei Code ziehen. – Squashman

+0

Folgendes ist eine funktionierende Powershell-Lösung, die funktioniert hat: powershell -Command "(Get-Content -Pfad 'C: \ file.txt'). Split ('') | foreach {if ($ _ -match 'average') { $ _ -replace "" "[^^. 0-9]" "", "" | Out-File -FilePath 'D: \ file_output.txt' -Append}} " Gutschrift geht an Adrian C. – secondplace

+0

Dann poste deinen Kommentar als Antwort. – Squashman

Antwort

0

folgende ist eine funktionierende Lösung Powershell:

powershell -Command "(Get-Content -Path 'C:\file.txt').Split(' ') | foreach { if ($_ -match 'average'){ $_ -replace """[^^.0-9]""" , '' | Out-File -FilePath 'D:\file_output.txt' -Append}}" 

Kredit geht an Adrian C.

0

Test-string:

[Parsed_psnr_0 @ 0000000003763ec0] PSNR y:18.250891 u:33.358190 v:36.566447 average:19.962586 min:11.944585 max:41.255356 

Powershell-Lösung (in eine .cmd Datei werfen):

powershell -Command "(Get-Content -Path 'D:\workfolder\test.txt') -match 'average:(.+?)' | Out-File -FilePath 'D:\workfolder\test_result.txt' -Append" 

Update:

SET "PS=%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\powershell.exe" 
%PS% -Command "gc 'D:\workfolder\test.txt'|%{If($_-match 'average:(.+?)'){$Matches[0]}}|Out-File -FilePath 'D:\workfolder\test_result.txt' -Append" 
+0

wird dies "True" ausgeben. Ist es möglich, den tatsächlichen Wert (19.962586) an den Ausgang zu übergeben? – secondplace

+0

@secondplace Haben Sie es versucht? 'Get-Content' sollte ein Array zurückgeben und wenn '-match' verwendet wird, gibt es die Matches zurück, die dann an' Out-File' weitergeleitet werden. Welche Version von PowerShell verwenden Sie? – TheIncorrigible1

+0

die folgende Version: PSVersion 5.1.14393.1914 – secondplace

0

Hier sind zwei Möglichkeiten, Sie kann dies mit einem Batch-Fil e. Es gibt auch andere Lösungen. Aber beide sollten nach Ihrem Beispiel funktionieren.

@echo off 
REM Option 1 
FOR /F "tokens=5 delims=:" %%G IN (test.txt) DO (
    FOR /F "tokens=1" %%H IN ("%%~G") DO set "average1=%%~H" 
) 
echo average1: %average1% 

REM option 2 
setlocal enabledelayedexpansion 
FOR /F "delims=" %%G IN (test.txt) DO (
    set "line=%%~G" 
    FOR /F "tokens=1" %%H IN ("!line:*average:=!") DO set average2=%%H 
) 
endlocal&set "average2=%average2%" 
echo average2: %average2% 

pause 
Verwandte Themen