@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
:: make a tempdir
:maketemp
SET "tempdir=%temp%\%random%"
IF EXIST "%tempdir%\" (GOTO maketemp) ELSE (MD "%tempdir%")
:: read each filename from source and process
for %%I in ("%sourcedir%\*.txt") DO (
TITLE Processing %%I
START "%%I" q43060025s "%%I"
CALL :wait 10
)
CALL :wait 1
RD "%tempdir%"
GOTO :EOF
:: monitor number of files in temp directory and return if fewer than %1
:wait
:: wait 1 second
timeout /t 1 >NUL
FOR /f %%c IN ('dir /b /a-d "%tempdir%\*" 2^>nul ^| find /c /v "" ') DO IF %%c geq %1 GOTO wait
GOTO :eof
Sie müssten die Einstellung von sourcedir
zu ändern, um Ihre Umstände anzupassen. Ich habe einige Dummy .txt
Dateien zum Testen verwendet.
Die Zeitanforderung wird wahrscheinlich verursacht, weil Sie die Dateien seriell verarbeiten. Die Lösung besteht darin, die Dateien parallel zu verarbeiten, indem die Leistungsfähigkeit der mehreren Kerne in modernen PCs genutzt wird.
Die Idee hier ist ein temporäres Verzeichnis machen Steuerdateien enthalten soll, dann jede Datei verarbeiten, um eine Unterprozedur Charge mit (q43060025s.bat
)
Die Unterprozedur der rufenden Prozedur Umwelt erbt, so wird tempdir
hergestellt werden .
@ECHO OFF
SETLOCAL
:: do some operation on the filename passed as %1
title processing %~1
ECHO %time%>"%tempdir%\%~n1"
:: 4 to 21-second delay
SET /a delay=%RANDOM% %% 18 + 4
timeout /t %delay% >NUL
DEL "%tempdir%\%~n1"
CLS
exit
Also - die Unterprozedur hier ist ein Dummy zur Demonstration. Es verwendet tempdir
und erstellt eine Datei in diesem Verzeichnis mit dem Namen der Datei zu verarbeitet werden, die etwas - Früher habe ich nur die Zeit.
Meine Sub-Prozedur verzögert dann einfach für 4 bis 21 Sekunden und simuliert einen Prozess mit einer variablen Verarbeitungszeit.
Anschließend löscht er die Datei, erstellt und beendet.
Die Hauptprozedur überwacht die Anzahl der Dateien im temporären Verzeichnis, dh die Anzahl der ausgeführten Unterprozesse. Zählen Sie einfach die Dateien und wenn die Anzahl größer oder gleich dem übergebenen Parameter ist, warten Sie 1 Sekunde und versuchen Sie es erneut.
Wenn die Unterprozedur ihre Arbeit beendet, wird die Zählung reduziert und die Routine :wait
wird beendet. Die nächste Datei wird ausgewählt, an den Unterprozess gesendet und wir warten erneut.
Wenn die letzte Datei gesendet wurde, warten wir weiter, bis die Anzahl der Unterprozesse null ist (dh kleiner als 1), wenn wir das temporäre Verzeichnis löschen können.
Also - alles, was Sie tun müssen, ist Ihre Verarbeitung anstelle der Verzögerung Routine in q43060025s
mit dem Dateinamen als %1
übergeben und Ihr Problem sollte gelöst werden.
Eine Frage zur Verbesserung eines bereits funktionierenden Codes sollte in [Code Review] (http://codereview.stackexchange.com/) gestellt werden. – Mofi
Warum in Ihrem ersten Befehl der erste Skalierungsfilter? In Ihrem zweiten Befehl hat die Größenoption keinen Effekt, da Sie die Streams kopieren. Sie können all dies in einem Befehl ausführen und einen Videocodierungsschritt überspringen. Ihr endgültiger Codierungsschritt könnte eine schnelle Voreinstellung verwenden. Es macht keinen großen Unterschied in der Qualität. – Mulvya
Werden die ersten Befehlsergebnisse nicht durch die zweite überschrieben? – Magoo