Обработка файлов и папок с помощью перетаскивания, фильтрация типов файлов - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь создать пакетный скрипт, который может принимать любой из следующих трех входов:

- перетащите папку
- перетащить один файл
-тянуть и отбросить выбор нескольких файлов

и выполните команду cmd (транскодирование некоторого видео с помощью VLC) для всех представленных файлов, соответствующих списку типов файлов. Я пытался сделать это несколькими разными способами, но каждый из них, похоже, имеет тот или иной недостаток.

Я могу заставить скрипт проверить, установлен ли VLC, определить, был ли ему предоставлен файл, файлы или папка, и обработать отдельный файл просто без фильтрации расширений; он обрабатывает несколько файлов, обрабатывает папку и фильтрует по расширению, которое вызывает у меня:

@echo off
Title PPT Transcoder
Mode con cols=120 lines=16
IF [%~1] == "" GoTo :Error_ranDirectly
IF exist "C:\Program Files\VideoLAN\VLC\vlc.exe" (
    CD /D "%~1">nul 2>&1 && Goto :Explorer_Folder || Goto :Files
) else (
    Goto :Error_VLCNotInstalled
)
Exit /b
::**********************************************************
:Files <File>
Color 0E
ECHO    Transcoding %1 to %1_PPT.mp4... 

REM I really want to filter for six filetypes here (.mp4, .avi, .mov., .wmv,
REM .flv, .gif) and not affect any others. Forfiles looks like it could 
REM work, but I can't figure out how to get it to work on my arguments 
REM rather than the entire folder of files that match the filter.

"C:\Program Files\VideoLAN\VLC\vlc.exe" [a bunch of flags] %1 [a bunch more flags]:file{dst=%1_PPT.mp4,no-overwrite} [even more flags] vlc://quit
IF [%~2] == "" Goto :FilesFinished
shift 
GoTo :Files
:FilesFinished
Color 0A
Echo Finished processing.
Timeout /T 10 /NoBreak >nul
Exit /b

::**********************************************************
:Explorer_Folder <Folder>
REM This block of code almost works, but i think it malforms the file names 
REM fed to vlc.  It runs and thinks it's working, but fails to actually 
REM accomplish anything.

setlocal
Color 0C
SET /P AREYOUSURE=Transcode all files in folder %1 (Y/[N])?
IF /I "%AREYOUSURE%" NEQ "Y" GOTO :Abort
Color 0F
for %%x in (%1\*.mp4 %1\*.mov %1\*.avi %1\*.wmv %1\*.flv) do (
echo Transcoding %%x to %%x_PPT.mp4... 
""C:\Program Files\VideoLAN\VLC\vlc.exe" [a bunch of flags] %%x [a bunch more flags]:file{dst=%%x_PPT.mp4,no-overwrite} [even more flags] vlc://quit
echo Done.)
Timeout /T 10 /NoBreak >nul
endlocal
Exit /b
::**********************************************************
:Error_RanDirectly
Color 0C & echo(
ECHO    Drag and drop video files on the icon to transcode them. 
Timeout /T 5 /NoBreak >nul
Exit /b
::**********************************************************
:Error_VLCNotInstalled
Color 0C & echo(
ECHO    VLC 64-bit (free download from videolan.org) must be installed.
Timeout /T 10 /NoBreak >nul
Exit /b
::**********************************************************
:Abort
Exit /b

Полагаю, что это общий вопрос: существует ли общепринятая основа для интеллектуального управления выполнением пакетного сценария перетаскиванием?

1 Ответ

0 голосов
/ 10 мая 2018

Сохраните это как файл cmd и поместите в него каталоги и файлы. Посмотрите, как это работает.

@setlocal ENABLEEXTENSIONS
@rem @set prompt=$G

@call :ShowTypes %*
@pause
@exit /b

:ShowTypes
@echo Processing:
:_showTypes
@rem If it exists with a slash appended to the end, 
@rem it's directory, otherwise a file type.
@if exist "%1\\" (@set _type=directory) else (@call :SetFileType "%1")
@if "%1" neq "" (echo %1 as %_type%) else (exit /b 0)
@shift
@goto :_showTypes

:SetFileType
@rem %~x1 is the extension of the first parameter passed by caller.
@set _type=%~x1
@rem Remove the dot from the extension string.
@set _type=%_type:.=%
@rem Now _type is whatever the extension was.
@exit /b 0

Удалите начальный символ @, чтобы увидеть эту линию в действии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...