Перемещение файлов мультимедиа с определенным языком в определенные папки - PullRequest
2 голосов
/ 04 ноября 2019

В настоящее время я пытаюсь выяснить, как можно автоматически переместить все файлы мультимедиа в определенные папки, как только они появятся в моей папке C: \ Media \

Что у меня есть на данный момент: определить, на каком языке мой файл мультимедиаэто я хочу использовать ffprobe.exe. Эта команда выводит язык первого аудиопотока:

ffprobe.exe "C:Media\test.mkv" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1

Это вывод:

1|eng

Этот медиафайл должен быть автоматически перемещен в папку C: \ Media \ English.

Как мне добиться этого в Windows 10? Кроме того, как я могу запустить его все время, чтобы, когда какой-либо медиа-файл находился в этой папке, он автоматически перемещался?

Иногда медиа-файл не находится непосредственно в C: \ Media \, иногда он находится в подпапке. ,Как я могу убедиться в том, что также ищутся подпапки?

Я никогда раньше не использовал язык сценариев в Windows. Какой язык сценариев является правильным для моей цели?

_ _ _

РЕДАКТИРОВАТЬ Вывод:

Microsoft Windows [Version 10.0.17763.805]
(c) 2018 Microsoft Corporation. Alle Rechte vorbehalten.

C:\Users\salexes>FOR /R "C:\Media\"  %_ IN (*.mkv) DO @(
More?   ECHO.  Checking: %~f_
More?   ECHO. Running [ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1]
More?   FOR /F "Tokens=2 Delims=|" %A IN ('
More?     C:\Media\ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1
More?   ') DO @(
More?     ECHO. FOR /F Loop returned [%%A]
More?     IF NOT EXIST "C:\Media\%A" (
More?       MD "C:\Media\%A" )
More?     ECHO. Moving "%~f_" TO: "C:\Media\%A\%~nx_"
More?     MOVE /Y "%~f_" "C:\Media\%A\%~nx_"
More?   )
More? )
  Checking: C:\Media\TestMKV3.mkv
 Running [ffprobe.exe "C:\Media\TestMKV3.mkv" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1]
  Checking: C:\Media\TestSubFolder\TestMKV1.mkv
 Running [ffprobe.exe "C:\Media\TestSubFolder\TestMKV1.mkv" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1]
  Checking: C:\Media\TestSubFolder2\TestMKV2.mkv
 Running [ffprobe.exe "C:\Media\TestSubFolder2\TestMKV2.mkv" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1]

C:\Users\salexes>

РЕДАКТИРОВАТЬ 2 ОБНОВЛЕННЫЙ СКРИПТ: ВЫХОД:

C:\Media>FOR /R "C:\Media\"  %_ IN (*.mkv) DO @(
More?   ECHO.  Checking: %~f_
More?   ECHO. Running [ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0]
More?   ECHO.
More?   ECHO.===========
More?   ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0
More?   ECHO.===========
More?   ECHO.
More?   FOR /F "Tokens=*" %A IN ('
More?     ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0
More?   ') DO @(
More?     ECHO. FOR /F Loop returned
More?     ECHO. "%A"
More?     IF NOT EXIST "C:\Media\%A" (
More?        MD "C:\Media\%A" )
More?     ECHO. Moving "%~f_" TO: "C:\Media\%A\%~nx_"
More?       MOVE /Y "%~f_" "C:\Media\%A\%~nx_"
More?   )
More? )
  Checking: C:\Media\TestMKV3.mkv
 Running [ffprobe.exe "C:\Media\TestMKV3.mkv" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0]

===========
1,eng
===========

  Checking: C:\Media\TestSubFolder\TestMKV1.mkv
 Running [ffprobe.exe "C:\Media\TestSubFolder\TestMKV1.mkv" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0]
.
===========
1,fr
===========
.
  Checking: C:\Media\TestSubFolder2\TestMKV2.mkv
 Running [ffprobe.exe "C:\Media\TestSubFolder2\TestMKV2.mkv" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0]
.
===========
1,eng
===========
.

C:\Media>

1 Ответ

1 голос
/ 04 ноября 2019

Могу ли я предположить, что все файлы, которые вы хотите проверить, являются .mkv?

Вы можете зациклить файлы в их папках, используя цикл For /R для зацикливания файлов в C: \ Media и любой другойподкаталоги.

было бы намного проще просто переместить файлы в каталоги, соответствующие любому возвращаемому языку, поэтому eng вместо english.

Если вам нужно иметь полныйимена для какого-то другого кода, было бы проще всего просто MKLINK /J "C\Media\English" "C\Media\Eng" вручную для всех языков, для которых вам нужны эти полные имена.

Вы можете запустить это непосредственно в CMD Prompt, вставив его в:

FOR /R "C:\Media\"  %_ IN (*.mkv) DO @(
  ECHO.  Checking: %~f_
  ECHO. Running [ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1]
  FOR /F "Tokens=2 Delims=|" %A IN ('
    ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1
  ') DO @(
    ECHO. FOR /F Loop returned [%A]
    IF NOT EXIST "C:\Media\%A" (
      MD "C:\Media\%A" )
    ECHO. Moving "%~f_" TO: "C:\Media\%A\%~nx_"
    MOVE /Y "%~f_" "C:\Media\%A\%~nx_"
  )
)

Кроме того, как я могу запустить его все время, чтобы, когда какой-либо медиа-файл находился в этой папке, он автоматически перемещался?

Настройка запланированной задачи с помощью планировщика задач,и запускать скрипт каждые X минут, также убедитесь, что вы задали задачу не выполняющейся, если предыдущая команда все еще выполнялась, и наложили ограничение на продолжительность ее выполнения, может быть, 30 минут.

Всегда использовать«Новая задача» не «Новая базовая задача», установите флажок «Запускать с наивысшими привилегиями» и выберите самую последнюю версию окон, доступных в раскрывающемся списке.

REM Script: SortMKVs.cmd

@( SETLOCAL
  ECHO OFF
)

FOR /R "C:\Media\"  %%_ IN (*.mkv) DO @(
  ECHO.  Checking: %%~f_
  ECHO. Running [ffprobe.exe "%%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1]
  FOR /F "Tokens=2 Delims=|" %%A IN ('
    ffprobe.exe "%%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of compact=p=0:nk=1
  ') DO (
    ECHO. FOR /F Loop returned [%%A]
    IF NOT EXIST "C:\Media\%%A" (
      MD "C:\Media\%%A" )
    ECHO. Moving "%%~f_" TO: "C:\Media\%%A\%%~nx_"
    MOVE /Y "%%~f_" "C:\Media\%%A\%%~nx_"
  )
)

( ENDLOCAL
  GOTO :EOF
)

Редактировать метод прямого тестирования v2:

FOR /R "C:\Media\"  %_ IN (*.mkv) DO @(
  ECHO.  Checking: %~f_
  ECHO. Running [ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0]
  ECHO.
  ECHO.===========
  ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0
  ECHO.===========
  ECHO.
  FOR /F "Tokens=*" %A IN ('
    ffprobe.exe "%~f_" -show_entries stream=index:stream_tags=language -select_streams 1 -v 0 -of csv=p=0
  ') DO @(
    ECHO. FOR /F Loop returned 
    ECHO. "%A"
    IF NOT EXIST "C:\Media\%A" (
      REM MD "C:\Media\%A" )
    ECHO. Moving "%~f_" TO: "C:\Media\%A\%~nx_"
    REM MOVE /Y "%~f_" "C:\Media\%A\%~nx_"
  )
)
...