我正在研究一个监视大型视频文件的文件夹的简单脚本,如果它大于设置的大小,它应该将它发送到HandBrake进行转换。
脚本的主要功能已经完成并且或多或少有效,但是我在显示HandBrake的正确输出时遇到了问题。
这是我到目前为止所写的内容:
$Folder = "E:\Series" #Folder to be monitored for large video files.
$Output = "E:\Encoded" #Folder where encoding jobs go to, and that will be monitored for completed jobs to replace the original file with.
$MaxMB = "15" #Max MB a minute
$MI_CLI = "C:\Program Files\MediaInfoCLI\MediaInfo.exe" #Location oo MediaInfoCLI
$HB_CLI = "C:\Program Files\Handbrake\HandBrakeCLI.exe" #Location of HandBrakeCLI
$HB_Container = "Copy" #HandBrake container output
$Filter = '*.*'
Write-Host "Monitoring "
$fsw = New-Object IO.FileSystemWatcher $Folder, $Filter
$fsw.IncludeSubdirectories = $true
Register-ObjectEvent $fsw Changed -SourceIdentifier FileUpdated -Action {
Start-Sleep -s 1
$FilePath = $EventArgs.FullPath
$FileName = $FilePath.split('\')[-1]
if($FilePath -imatch '\.(?:mp4|mkv)'){
if((Test-Path -LiteralPath $filePath) -and -not (Test-Path -LiteralPath "$Output\$FileName")){
if(Test-FileReady $FilePath){
$fileSize = (Get-Item $FilePath).length
if($fileSize -ge 734003200){
Write-Host ""
Write-Host "Large Video Detected: `"$($FileName)`""
Write-Host "Sending To HandBrake..."
HB-Convert $FilePath $Output
}
}
}
}
}
function HB-Convert{
param ([parameter(Mandatory=$true)][string]$source,[parameter(Mandatory=$true)][string]$dest)
if(-not (Test-Path $source) -or -not (Test-Path $dest)) {return}
$FileName = $source.split('\')[-1]
start-process $HB_CLI -ArgumentList "-i `"$source`" -t 13 --angle 1 -c 1 -o `"$dest\$FileName`" -f mkv -w 1280 --crop 0:0:0:0 --loose-anamorphic --modulus 2 -e x265 -q 20 --vfr -a 1 -E copy -6 dpl2 -R Auto -B 160 -D 0 --gain 0 --audio-fallback ac3 --encoder-preset=faster --verbose=0 2> log.txt" -wait -nonewwindow
#HandBrakeCLI -i `"$source`" -t 13 --angle 1 -c 1 -o `"$dest\$FileName`" -f mkv -w 1280 --crop 0:0:0:0 --loose-anamorphic --modulus 2 -e x265 -q 20 --vfr -a 1 -E copy -6 dpl2 -R Auto -B 160 -D 0 --gain 0 --audio-fallback ac3 --encoder-preset=faster --verbose=0 2> log.txt
}
function Test-FileReady {
Param([parameter(Mandatory=$true)]$path)
if (Test-Path -LiteralPath $path) {
trap {
return $false
}
$stream = New-Object system.IO.StreamReader $path
if ($stream) {
$stream.Close()
return $true
}
}
}
现在在 HB-Convert功能中,我有2行调用HandBrakeCLI。
一个通过开始流程
和一个使用 HandBrakeCLI (我已将handbrake dir添加到我的系统环境变量中)
后者现已标出。
当我在命令提示符中手动调用HB-Convert(使用HandBrakeCLI而不是Start-Process)时,一切都会像我一样只能显示手刹的进度。
编码:任务1的1,74.66%(26.78 fps,平均47.17 fps,ETA 00h05m40s)
现在当通过FileSystemWatcher调用它时,它不会显示任何来自手刹的内容,它只显示来自脚本的输出
检测到大视频:“FileName”
发送给HandBrake ......
它将挂起,直到编码完成
现在,当FileSystemWatcher使用启动进程手刹调用HB-Convert时,将输出所有数据,而不仅仅是进度,这非常令人讨厌。
那么当我调用FileSystemWatcher时,如何才能显示进度。
我一直试图让它工作几个小时它让我疯狂。希望有人能解决这个问题 我只是为此学到了一点PS,所以当我说我是PS的小块时,这是轻描淡写的:D
答案 0 :(得分:0)
好的,我得到了它的工作
将其添加到脚本
function global:HB-UpdateProgress{
Process{
$position = $host.ui.rawui.cursorposition
$position.X = 0
$host.ui.rawui.cursorposition = $position
Write-Host @($input)[0] -NoNewline
}
}
然后在调用HandBrakeCLI时将其用作管道将正确显示输出