powershell和控制台应用程序输出

问题描述:

我试图使用powershell和ffmpeg工具自动化视频转换。 如果调用没有所有nessesary参数,Ffmpeg具有关于视频的详细输出。通常它会报告错误并显示输入文件信息(如果指定)。 例我交互执行这样的命令:powershell和控制台应用程序输出

d:\ video.Enc \ ffmpeg.exe -id:\ video.Enc \ 1.wmv

这是的powershell控制台输出

ffmpeg.exe : FFmpeg version SVN-r20428, Copyright (c) 2000-2009 Fabrice Bellard, et al. 
row:1 char:24 
+ d:\video.Enc\ffmpeg.exe <<<< -i d:\video.Enc\1.wmv 
    + CategoryInfo   : NotSpecified: (FFmpeg version ...Bel 
    lard, et al.:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

    built on Nov 1 2009 04:03:50 with gcc 4.2.4 
    configuration: --enable-memalign-hack --prefix=/mingw --cross-pre 
fix=i686-mingw32- --cc=ccache-i686-mingw32-gcc --target-os=mingw32 
--arch=i686 --cpu=i686 --enable-avisynth --enable-gpl --enable-vers 
ion3 --enable-zlib --enable-bzlib --enable-libgsm --enable-libfaad 
--enable-pthreads --enable-libvorbis --enable-libtheora --enable-li 
bspeex --enable-libmp3lame --enable-libopenjpeg --enable-libxvid -- 
enable-libschroedinger --enable-libx264 --enable-libopencore_amrwb 
--enable-libopencore_amrnb 
    libavutil  50. 3. 0/50. 3. 0 
    libavcodec 52.37. 1/52.37. 1 
    libavformat 52.39. 2/52.39. 2 
    libavdevice 52. 2. 0/52. 2. 0 
    libswscale  0. 7. 1/0. 7. 1 
[wmv3 @ 0x144dc00]Extra data: 8 bits left, value: 0 

Seems stream 1 codec frame rate differs from container frame rate: 
1000.00 (1000/1) -> 15.00 (15/1) 
Input #0, asf, from 'd:\video.Enc\1.wmv': 
    Duration: 00:12:0 
2.00, start: 5.000000, bitrate: 197 kb/s 
    Stream #0.0(eng): Audio: wmav2, 44100 Hz, 1 channels, s16, 48 k 
b/s 
    Stream #0.1(eng): Video: wmv3, yuv420p, 1024x768, 137 kb/s, 15 tbr, 1k tbn, 1k tbc Metadata 
    title   : Silverlight 2.0 Hello World Application 
    author   : Sergey Pugachev 
    copyright  : 
    comment   : 
    WMFSDKVersion : 11.0.6001.7000 
    WMFSDKNeeded : 0.0.0.0000 
    IsVBR   : 1 
    ASFLeakyBucketPairs: 
    VBR Peak  : 715351 
    Buffer Average : 127036 
At least one output file must be specified 

但我不知道如何编写脚本并将输出捕获到任何类型的posh对象。 我试过直接脚本,而ps1文件包含准确的表达式“d:\ video.Enc \ ffmpeg.exe -i d:\ video.Enc \ 1.wmv” - 它没有工作。另外我试图用invoke-command和invoke表达来做到这一点。第一个返回一个确切的字符串与命令,第二个 - 转储错误输出控制台,但不是我指定的-ErrorVariable(我确实设置了所有的变量,不仅错误一 - 所有这些都是空的)。

任何人都可以指向正确的语法来调用posh中的控制台应用程序并捕获输出吗?

第二个问题是解析输出 - 我需要视频分辨率数据来计算转换的正确高宽比。因此,这将是冷静,如果有人点了如何使用捕获错误输出工作,并解析字符串如

流#0.1(ENG):视频:WMV3,YUV420P,1024×768

尝试重定向错误流到stdout像这样,然后你应该能够捕捉到标准输出和标准错误在一个单一的变量如:

$res = d:\video.Enc\ffmpeg.exe -i d:\video.Enc\1.wmv 2>&1 

捕获数据试试这个:

$res | Select-String '(?ims)^Stream.*?(\d{3,4}x\d{3,4})' -all | 
    %{$_.matches} | %{$_.Groups[1].Value} 

我不确定$ res是一个字符串还是多个字符,但上面这两个字符都适用。

+0

Stderr以标准输出正常工作。谢谢。 有什么办法分别获得stderr和stdout吗? 数据采集有点不同(有2个或多个分离的流输出信息 - 音频和视频),至少需要反向引用或排除“流”,但这一点我可以完成自己。赞赏你给我的出发点。 – 2009-12-02 07:43:23

+0

是的,你可以分别捕获它们 - ffmpeg.exe ...> foo.txt 2> foo.err – 2009-12-02 14:56:57

+0

:)我没有完全清楚:)是否有任何posh方式来分别获取数据流。 Ex Invoke-Expression具有用于指定ErrorVariable和OutVariables的键。有什么方法可以使用这种语法来获取输出,而不是使用临时文件? – 2009-12-02 16:13:36