Sortie de l'application PowerShell et console
-
11-09-2019 - |
Question
Im essayant d'automatiser la conversion vidéo avec PowerShell et l'outil FFMPEG. FFMPEG a une sortie détaillée sur la vidéo si elle est appelée sans tous les paramètres nessesaires. Habituellement, il rapporte des informations sur l'erreur et afficher le fichier d'entrée si l'on a spécifié. Ex j'ai exécuté de manière interactive une telle commande:
d: video.enc ffmpeg.exe -id: video.enc 1.wmv
C'est la sortie de la console 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
Mais je ne peux pas comprendre comment scripter cela et capturer la sortie vers n'importe quel type d'objets chics. J'ai essayé le script direct, où le fichier ps1 contenait l'expression exacte "d: video.enc ffmpeg.exe -id: video.enc 1.wmv" - cela n'a pas fonctionné. J'ai également essayé de le faire avec l'invocat et l'invocation de l'expression. Le premier renvoie une chaîne exacte avec la commande, deuxième - du vidage d'erreur sur la console de sortie mais pas sur -ErrorVariable J'ai spécifié (j'ai définie toutes les variables, pas seulement l'erreur une - toutes étaient vides).
Quelqu'un peut-il indiquer la syntaxe de corriger pour invoquer des applications de console dans Posh et la capture de sortie?
La deuxième question concernera l'analyse de cette sortie - j'aurai besoin de données de résolution vidéo pour calculer le rapport d'aspect correct pour la conversion. Il sera donc cool si quelqu'un indique comment travailler avec une sortie d'erreur capturée et une chaîne d'analyse comme
Stream # 0.1 (Eng): Vidéo: WMV3, YUV420P, 1024x768,
La solution
Essayez de rediriger le flux d'erreur vers STDOUT comme tel, puis vous devriez pouvoir capturer STDOUT et STDERR dans une seule variable, par exemple:
$res = d:\video.Enc\ffmpeg.exe -i d:\video.Enc\1.wmv 2>&1
Pour capturer les données, essayez ceci:
$res | Select-String '(?ims)^Stream.*?(\d{3,4}x\d{3,4})' -all |
%{$_.matches} | %{$_.Groups[1].Value}
Je ne sais pas si $ res sera une chaîne ou plusieurs, mais ce qui précède devrait fonctionner pour les deux cas.