PowerShell y salida de la aplicación de la consola
-
11-09-2019 - |
Pregunta
Estoy tratando de automatizar la conversión de video con PowerShell y la herramienta FFMPEG. FFMPEG tiene una salida detallada sobre el video si se llama sin todos los parámetros de Nessesary. Por lo general, informa sobre el error y muestra la información del archivo de entrada si se especifica. Ex ejecuté interactivamente dicho comando:
D: video.enc ffmpeg.exe -id: video.enc 1.wmv
Esta es la salida de la consola 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
Pero no puedo imaginar cómo escribir esto y capturar la salida a cualquier tipo de objetos elegantes. Intenté script directo, donde el archivo PS1 contenía expresión exacta "d: video.enc ffmpeg.exe -id: video.enc 1.wmv" - no funcionó. También intenté hacer eso con Invoke-Command e Invoke Expression. Primero devuelve una cadena exacta con el comando, segundo: error de volcado a la consola de salida, pero no a -srorvariable, especifiqué (establecí todas las variables, no solo el error uno, todos ellos estaban vacíos).
¿Alguien puede señalar la sintaxis para invocar aplicaciones de consola en POSH y capturar la salida?
La segunda pregunta será sobre analizar esa salida: necesitaré datos de resolución de video para calcular la relación de aspecto correcta para la conversión. Por lo tanto, será genial si alguien señala cómo trabajar con salida de error capturada y cadena de analización como
Transmisión #0.1 (Eng): Video: WMV3, YUV420P, 1024x768,
Solución
Intente redirigir la secuencia de errores a stdout así y luego debería poder capturar STDOUT y STDERR en una sola variable, por ejemplo:
$res = d:\video.Enc\ffmpeg.exe -i d:\video.Enc\1.wmv 2>&1
Para capturar los datos, pruebe esto:
$res | Select-String '(?ims)^Stream.*?(\d{3,4}x\d{3,4})' -all |
%{$_.matches} | %{$_.Groups[1].Value}
No estoy seguro de si $ res será una cadena o múltiple, pero lo anterior debería funcionar para ambos casos.