PowerShell在FileSystemWatcher中显示HandBrakeCLI的正确输出数据

时间:2016-03-28 05:23:33

标签: powershell output filesystemwatcher

我正在研究一个监视大型视频文件的文件夹的简单脚本,如果它大于设置的大小,它应该将它发送到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

1 个答案:

答案 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时将其用作管道将正确显示输出