2011-12-28 2 views
0

Я вытащил сценарий Bash с here, который проверяет файл AVI на наличие плохих кадров, используя расширение ffmpeg и cygwin. Я могу выполнить код в Mingw. Я помещаю ffmpeg.exe (ren ffmpeg), cygwin1.dll & cygz.dll в bin bin (/ c/mingw/bin /). Теперь, я ищу, чтобы портировать этот код bash в PowerShell. Может ли кто-нибудь пролить свет PowerShell на этот?Преобразование простого сценария Bash в PowerShell?

Сценарий:(путь:/с/mygw/бен/AviConvert)

#!/bin/bash 

FFMPEG="ffmpeg" 
LIST=`find | grep \.avi$` 

for i in $LIST; do 
    OUTP="$i.txt" 
    OUTP_OK="$i.txt.ok" 
    TMP_OUTP="$i.tmp" 
    if [ -f "$OUTP" -o -f "$OUTP_OK" ] ; then 
    echo Skipping "$i" 
    else 
    echo Checking "$i"... 
    RESULT="bad" 
    ffmpeg -v 5 -i "$i" -f null - 2> "$TMP_OUTP" && \ 
     mv "$TMP_OUTP" "$OUTP" && \ 
     RESULT=`grep -v "\(frame\)\|\(Press\)" "$OUTP" | grep "\["` 
    if [ -z "$RESULT" ] ; then 
     mv "$OUTP" "$OUTP_OK" 
    fi 
    fi 
done 
+0

Как далеко вы получить, когда вы попробовали это самостоятельно? Что именно вы застряли? – zdan

+0

Его работа отлично. Для каждого файла AVI в целевой папке он генерирует файл отчета с * .ok (если файл не имеет дефектного фрейма), * .txt (если были какие-то ошибки кадра fround) или * .tmp (в то время как его процесс). Но обработка происходит очень медленно. Я думал, что запуск сценария в PowerShell может улучшить производительность, поскольку mingw эмулирует среду bash (что означает много накладных расходов?). CMIIW! –

+3

Я подозреваю, что самая длинная вещь - это команда 'ffmpeg -v 5 -i '$ i" -f null - 2> "$ TMP_OUTP" '. Вы пробовали использовать сборку для windows avaialble [здесь] (http://ffmpeg.zeranoe.com/builds/).? Вы можете сравнить cygwin и Powershell, просто обработав 1 из ваших файлов AVI и сравнив время завершения. –

ответ

3

Если вы не смогли бы найти подобное уже приготовлено в PowerShell, ваш единственный шанс, чтобы понять это логика сценария и написать один в PowerShell с нуля с Есть большие отличия.

Посмотрите на различия в синтаксисе/командах и выполните соответствующий перевод. Некоторые Bash vs Powershell связанные записи/документы, доступные в Интернете, например. this. И, конечно, обратитесь к руководствам PowerShell Getting Started. Например, синтаксис для для отличается, для PowerShell является:

for (_init_, _cond_, _incr_) { 
    _operators_ 
} 

Кстати, в вашем случае лучше использовать Еогеасп, то есть иметь что-то вроде:

(get-childitem $path -Recurse | select-string -pattern .avi | % {$_.Path} > matchingfiles.txt) 
$FILESARRAY = get-content matchingfiles.txt 
foreach ($FILE in $FILESARRAY) 
{ 
(get-content $FILE) |foreach-object {$_ -replace $find, $replace} | set-content $FILE 
} 
+0

Эта ссылка повреждена/не может быть разрешена. – Neil

Смежные вопросы