当前位置:  开发笔记 > 编程语言 > 正文

powershell和控制台应用输出

如何解决《powershell和控制台应用输出》经验,为你挑选了1个好方法。

我试图使用powershell和ffmpeg工具自动化视频转换.如果在没有所有nessesary参数的情况下调用,Ffmpeg会有关于视频的详细输出.通常它会报告错误并显示输入文件信息(如果指定了一个).Ex我以交互方式执行了这样的命令:

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

但我不知道如何编写脚本并将输出捕获到任何类型的豪华对象.我试过直接脚本,其中ps1文件包含精确表达"d:\ video.Enc\ffmpeg.exe -id:\ video.Enc\1.wmv" - 它没有用.我也尝试用invoke-command和invoke表达式来做到这一点.第一个返回一个带命令的精确字符串,第二个 - 输出控制台的转储错误但不指定我指定的-ErrorVariable(我确实设置了所有输出变量,不仅错误一 - 所有这些都是空的).

任何人都可以指出在豪华和捕获输出中调用控制台应用程序的正确语法吗?

第二个问题是解析输出 - 我需要视频分辨率数据来计算转换的正确宽高比.因此,如果有人指出如何使用捕获的错误输出和解析字符串,这将是很酷的

流#0.1(eng):视频:wmv3,yuv420p,1024x768,

Keith Hill.. 7

尝试将错误流重定向到stdout,然后你应该能够在单个变量中捕获stdout和stderr,例如:

$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是一个字符串还是多个字符串,但上述情况应适用于这两种情况.



1> Keith Hill..:

尝试将错误流重定向到stdout,然后你应该能够在单个变量中捕获stdout和stderr,例如:

$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是一个字符串还是多个字符串,但上述情况应适用于这两种情况.


>和2>是Posh方式,并且远远超过-ev和-ov,并且它们仅在cmdlet而不是EXE上可用.:-)现在,如果你不想去一个文件然后只是将一个命令的结果分配给一个变量将捕获stdout,但你仍然需要将stderr重定向到一个文件(这是最简单的).`$ res = ffmpeg.exe ... 2> err.txt; $ err = gc err.txt`您可以在调用ffmpeg.exe之前和之后检查$ error变量.如果发生错误(检查$ lastexitcode),则$ error [0]应该包含stderr信息.
推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有