在字符串中查找值并通过批处理文件将其输出到文本文件

时间:2017-11-29 16:02:06

标签: powershell batch-file cmd

我试图从ffmpeg输出中输出数字值并将其添加到文本文件中。

我想从批处理文件中将其作为单行运行,我已经设置了所有变量,但我不确定它是否可能。

这是输出字符串,我要复制average值:

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

在这种情况下19.962586,我有几个要处理的文件,数字总是不同。

这是一次无知的弱尝试:

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

没有工作,我尝试的100种变化也没有,但是我把它作为我正在尝试的内容的粗略概念。

3 个答案:

答案 0 :(得分:0)

测试字符串:

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

PowerShell解决方案(可以放入.cmd文件):

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

更新

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"

答案 1 :(得分:0)

以下是使用批处理文件执行此操作的两种方法。还有其他解决方案。但其中任何一个都应该基于你的例子。

@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

答案 2 :(得分:0)

以下是一个有效的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}}"

归功于Adrian C.