2016-08-04 91 views
0

因此,我编写了一个PowerShell脚本,递归地搜索特定大小以上的所有视频文件,然后调整它们的大小。Powershell和FFMPEG - FFMPEG未执行

我觉得我在这里丢失了一些明显的东西......因为我的脚本实际上并没有运行FFMPEG,只是显示了在屏幕上运行它的命令。我相信我会在解决方案方面面临挑战。

$SearchPath = "N:\baseball" 

$oldVideos = Get-ChildItem -Include @("*.mkv", "*.mov", "*.mpg", "*.wmv", "*.avi") -Path $SearchPath -Recurse | where-object {$_.length -gt 500MB}; 

Set-Location -Path 'C:\Program Files\ffmpeg\bin'; 

foreach ($OldVideo in $oldVideos) 
{ 
    $outputfolder = "O:\resized" 
    $oldname = Get-Item $oldvideo | Select-Object -ExpandProperty BaseName 
    $suffix = "_resized.mp4" 
    $newname = "$($oldname)_$($suffix)" 
    $ffmpeg = ".'C:\Program Files\ffmpeg\bin\ffmpeg.exe'" 
    $arguments = " -i `"$($OldVideo)`" -vf scale=720:trunc(ow/a/2)*2 -c:v libx264 -f mp4 `"$outputfolder\$newname`" -y" 
    $ffmpeg + $arguments} 

这里的实际输出到屏幕上,当我运行该脚本 .'C:\ Program Files文件\ ffmpeg的\ BIN \ ffmpeg.exe” -i “N:\棒球\打\ 067.MOV” -vf scale = 720:trunc(ow/a/2)* 2 -c:v libx264 -f mp4“O:\ resized \ 067__resized.mp4”-y

该命令应该执行(它运行在命令窗口)。

+0

你只是建立一些字符串变量。你实际上无处使用这些变量。 –

+0

最后我使用$ ffmpeg + $参数 –

+0

您可能可以使用'invoke-expression'来执行此操作 –

回答

0

我终于得到这个工作...我看着一对夫妇的其他脚本,以及他们如何执行...好像我做了这个过于复杂。 编辑:我添加了日志记录和附加功能删除原来的并将其移动到原来的位置。我可能应该添加一些错误处理来检查电影长度是否相同......首先要弄清楚。注意:日志记录功能不太正确......但是脚本的核心部分(查找500MB以上的电影,调整大小,移回原始文件夹并删除作品)。我还需要将2个检查添加到电影文件中。 1来查看调整大小的电影是否实际上较小并且电影持续时间是否相同。

$env:Path += ";C:\Program Files\ffmpeg\bin\" 

function Write-Log 
    { 
     param 
     (
      [string]$strMessage 
     ) 

      $LogDir = 'L:\conlogs\' 
      $Logfile = "\Conversion-Log.txt" 
      $Path = $logdir + $logfile 
      [string]$strDate = get-date 
      add-content -path $Path -value ($strDate + "`t:`t"+ $strMessage) 
} 

$SearchPath = "N:\baseball" 

$oldVideos = Get-ChildItem -Include @("*.mkv", "*.mov", "*.mpg", "*.wmv", "*.avi","*.mp4") -Path $SearchPath -Recurse | where-object {$_.length -gt 500MB} | where-object {$_.Name -NotMatch "resized"}; 

foreach ($OldVideo in $oldVideos) 
{ $outputfolder = "O:\resized" 
    $oldname = Get-Item $oldvideo | Select-Object -ExpandProperty BaseName 
    $suffix = "resized.mp4" 
    $newname = "$($oldname)_$($suffix)" 
    ffmpeg.exe -i $oldvideo.FullName -vf "scale=720:trunc(ow/a/2)*2" -c:v libx264 -f mp4 -y "$outputfolder\$newname" 

    $OriginalSize = (Get-Item $OldVideo).length 
    $ConvertedSize = (Get-Item $outputfolder\$Newname).length 

    If($ConvertedSize -le $OriginalSize) 
    { 
     Write-Log "$($NewVideo) has been successfully resized" 
     Remove-Item $OldVideo 

     If (Test-Path $OldVideo) 
     { 
      write-log "Unable to remove $($OldVideo)" 
     } 

     Else 
     { 
      write-log "Successfully removed $($OldVideo)" 
     } 
     Elseif 
     { 
      write-log "You dun goofed!" 
     } 

     $oldvidpath = [System.IO.Path]::GetDirectoryName($oldvideo) 
     Move-Item "$outputfolder\$Newname" -Destination $oldvidpath 

     If (Test-Path "$oldvidpath\$newname") 
     { 
      write-log "Unable to move $($newname)" 
     } 

     Else 
     { 
      write-log "Successfully moved $($OldVideo)" 
     } 

     Elseif 
     { 
      write-log "You dun goofed!" 
     } 
    } 
} 
2

现在你只是组合两个字符串,所以它输出组合的字符串。这正是你要求的。尝试将其更改为这样:

$SearchPath = "N:\baseball" 

$oldVideos = Get-ChildItem -Include @("*.mkv", "*.mov", "*.mpg", "*.wmv", "*.avi") -Path $SearchPath -Recurse | where-object {$_.length -gt 500MB}; 

Set-Location -Path 'C:\Program Files\ffmpeg\bin'; 

foreach ($OldVideo in $oldVideos) 
{ 
    $outputfolder = "O:\resized" 
    $oldname = Get-Item $oldvideo | Select-Object -ExpandProperty BaseName 
    $suffix = "_resized.mp4" 
    $newname = "$($oldname)_$($suffix)" 
    $ffmpeg = "'C:\Program Files\ffmpeg\bin\ffmpeg.exe'" 
    $arguments = " -i `"$($OldVideo)`" -vf scale=720:trunc(ow/a/2)*2 -c:v libx264 -f mp4 `"$outputfolder\$newname`" -y" 
    & $ffmpeg $arguments} 
+0

好吧,在正确的轨道上。现在的问题是$ OldVideo输出不再被引用,因此如果文件名或目录名具有空格,则脚本将中止。 –

+0

它应该仍然被引用,该部分应该不会有任何改变。 – TheMadTechnician