2016-08-04 49 views
0

Also schrieb ich ein Powershell-Skript, das rekursiv alle Videodateien ab einer bestimmten Größe durchsucht und dann die Größe ändert.Powershell und FFMPEG - FFMPEG wird nicht ausgeführt

Ich fühle mich, als ob ich etwas offensichtliches hier verpasse ... weil mein Skript FFMPEG nicht ausführt, es zeigt nur den Befehl an, es auf dem Bildschirm auszuführen. Ich bin mir sicher, dass ich mich bei der Lösung stellen werde.

$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} 

Hier ist die aktuelle Ausgabe auf dem Bildschirm, wenn ich das Skript ausführen .'C: \ Programme \ ffmpeg \ bin \ ffmpeg.exe‘-i "N: \ Baseball \ schlagen \ 067.MOV" -vf scale = 720: trunc (ow/a/2) * 2 -c: v libx264 -f mp4 "0: \ resized \ 067__resized.mp4" -y

Dieser Befehl sollte ausgeführt werden (er wird in einem Befehl ausgeführt Fenster).

+0

Sie nur einige String-Variablen erstellen. Nirgendwo benutzt du tatsächlich diese Variablen. –

+0

Am Ende benutze ich $ ffmpeg + $ Argumente –

+0

Sie könnten 'invoke-Ausdruck' für diese –

Antwort

0

ich endlich diese Arbeit bekam ... ich ein paar andere Skripte und sah, wie sie die Ausführung ... scheint, wie ich dies zu kompliziert gemacht. EDIT: Ich fügte Protokollierung und zusätzliche Funktionalität hinzu, um das Original zu löschen und es an den ursprünglichen Speicherort zu verschieben. Ich sollte wahrscheinlich eine Fehlerbehandlung hinzufügen, um zu sehen, ob die Filmlänge identisch ist ... ich muss das zuerst herausfinden. HINWEIS: Die Protokollierung funktioniert nicht ganz richtig ... aber der Kern des Skripts (Filme über 500 MB finden, Größe ändern, zum ursprünglichen Ordner zurückkehren und Arbeiten löschen). Ich muss den Filmdateien zwei Überprüfungen hinzufügen. 1, um zu sehen, ob der Film in der Größe kleiner ist und ob die Filmdauer identisch ist.

$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

Im Moment kombinieren Sie nur zwei Strings, also gibt es die kombinierte Zeichenkette aus. Es macht genau das, wonach du es fragst. Versuchen Sie es zu diesem Wechsel:

$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

Ok, auf dem richtigen Weg. Jetzt ist das Problem, dass die $ OldVideo-Ausgabe nicht mehr in Anführungszeichen gesetzt ist. Das Skript wird abgebrochen, wenn der Dateiname oder der Verzeichnisname Leerzeichen enthält. –

+0

sollte noch zitiert werden, dieser Teil sollte sich überhaupt nicht geändert haben. – TheMadTechnician