将电影文件从我的外部驱动器复制到我的 NAS
copy movie files from my external drive to my NAS
我有一个批量将电影文件从我的外部驱动器复制到我的 NAS。
文件名如下所示:
识骨寻踪 S09E18 - 剧集名称
批次:
set FOLNAME="Bones\Recordings\"
set FILENAME="Bones "
@echo on
if exist %LPATH%%FILENAME%S09* (if not exist %NASPATH%%FOLNAME%"Season 9" mkdir %NASPATH%%FOLNAME%"Season 9")
copy /Y %LPATH%%FILENAME%S09* %NASPATH%%FOLNAME%"Season 9"
目前我需要为每个季节编写代码。
是否可以获取季节编号并将其用作代码中的变量?
set "FOLNAME=Bones\Recordings"
set "FILENAME=Bones"
@echo on
for /L %%b in (0,1,9) do for /L %%c in (0,1,9) do (
if exist "%LPATH%\%FILENAME% S%%b%%c*" (
if %%b == 0 (
mkdir "%NASPATH%\%FOLNAME%\Season %%c" 2>nul
copy /Y "%LPATH%\%FILENAME% S%%b%%c*" "%NASPATH%\%FOLNAME%\Season %%c"
) else (
mkdir "%NASPATH%\%FOLNAME%\Season %%b%%c" 2>nul
copy /Y "%LPATH%\%FILENAME% S%%b%%c*" "%NASPATH%\%FOLNAME%\Season %%b%%c"
)
)
提示:使用 set "var1=data"
设置值 - 这避免了由批处理文件中的尾随空格引起的问题。不要在目录名中包含终端 \
- 违反直觉,这样可以更轻松地构建路径。
简单地使用 for/L
将 %%b
从 0 变为 9(好吧 - 可能 1 到 2 就足够了)和 %%c
类似地,并构造所需的名称,插入空格,根据需要使用反斜杠和引号。
2>nul
抑制错误消息(例如,目录已存在)。将 >nul
附加到 copy
命令将抑制报告副本的消息。请注意 2>nul
,因为这是一条错误消息,请注意 >nul
,因为这是一条正常消息。
在这里看看我是如何将标题与系列和剧集分开的。
@echo off
setlocal enabledelayedexpansion
for %%m in (*.mp4) do for %%i in (%%m) do for /f "tokens=1,*delims=SE-" %%a in ('echo %%i ^| findstr /R "S[0-9].E[0-9]."') do (
set "File=%%m"
set "remove=!File:*S%%aE%%b=!"
call set "Title=%%File:!remove!=%%"
echo File: "%%m" Movie Title: "!Title: S%%aE%%b=!" Season: "%%a" Episode: "%%b"
)
注意,我以 *.mp4
为例来遍历每个 mp4,仅用于演示目的。
这比必须手动指定文件夹名称更加动态。这纯粹是echo
的结果来证明。
我有一个批量将电影文件从我的外部驱动器复制到我的 NAS。
文件名如下所示:
识骨寻踪 S09E18 - 剧集名称
批次:
set FOLNAME="Bones\Recordings\"
set FILENAME="Bones "
@echo on
if exist %LPATH%%FILENAME%S09* (if not exist %NASPATH%%FOLNAME%"Season 9" mkdir %NASPATH%%FOLNAME%"Season 9")
copy /Y %LPATH%%FILENAME%S09* %NASPATH%%FOLNAME%"Season 9"
目前我需要为每个季节编写代码。
是否可以获取季节编号并将其用作代码中的变量?
set "FOLNAME=Bones\Recordings"
set "FILENAME=Bones"
@echo on
for /L %%b in (0,1,9) do for /L %%c in (0,1,9) do (
if exist "%LPATH%\%FILENAME% S%%b%%c*" (
if %%b == 0 (
mkdir "%NASPATH%\%FOLNAME%\Season %%c" 2>nul
copy /Y "%LPATH%\%FILENAME% S%%b%%c*" "%NASPATH%\%FOLNAME%\Season %%c"
) else (
mkdir "%NASPATH%\%FOLNAME%\Season %%b%%c" 2>nul
copy /Y "%LPATH%\%FILENAME% S%%b%%c*" "%NASPATH%\%FOLNAME%\Season %%b%%c"
)
)
提示:使用 set "var1=data"
设置值 - 这避免了由批处理文件中的尾随空格引起的问题。不要在目录名中包含终端 \
- 违反直觉,这样可以更轻松地构建路径。
简单地使用 for/L
将 %%b
从 0 变为 9(好吧 - 可能 1 到 2 就足够了)和 %%c
类似地,并构造所需的名称,插入空格,根据需要使用反斜杠和引号。
2>nul
抑制错误消息(例如,目录已存在)。将 >nul
附加到 copy
命令将抑制报告副本的消息。请注意 2>nul
,因为这是一条错误消息,请注意 >nul
,因为这是一条正常消息。
在这里看看我是如何将标题与系列和剧集分开的。
@echo off
setlocal enabledelayedexpansion
for %%m in (*.mp4) do for %%i in (%%m) do for /f "tokens=1,*delims=SE-" %%a in ('echo %%i ^| findstr /R "S[0-9].E[0-9]."') do (
set "File=%%m"
set "remove=!File:*S%%aE%%b=!"
call set "Title=%%File:!remove!=%%"
echo File: "%%m" Movie Title: "!Title: S%%aE%%b=!" Season: "%%a" Episode: "%%b"
)
注意,我以 *.mp4
为例来遍历每个 mp4,仅用于演示目的。
这比必须手动指定文件夹名称更加动态。这纯粹是echo
的结果来证明。