2016-08-04 249 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