多年来,我一直把所有的电影都放到一个文件夹中,以及所有他们的演员。 我已经意识到,现在经过几次挫折保留了nfo的备份,艺术将节省我几个小时的生活,并保持数据库更加可用,当添加一个新的科迪设置(电视,平板电脑,笔记本电脑等…)。 所以我试图批量创build一个基于电影文件名的文件夹,并将多个相关的文件移动到创build的文件夹。
要清楚,我想要制作电影的文件夹名称,并将所有相关文件放入该文件夹中。 电影文件名的格式可以改变,因为它们并不都具有相同的信息,即导演的剪辑,编辑,终极版本,这是在[]中。 主要的电影名称在任何情况下都是最小的文件名,我永远不会希望这个文件夹被命名为文件名中包含“[Extra]”的文件。 一般来说格式是“电影(年)[额外信息] … [额外信息]小描述在这里”为非电影video。
我想到的最好的是:
for %%i in (*) do md "%%~ni" && move "%%~i" "%%~ni"
现在的问题是我为每个文件创build一个文件夹,并将所有的文件移动到各自的文件夹,但相关的内容现在在不同的文件夹,具有完全相同的文件名的东西是留在主文件夹。
我试图完成的一个例子:
至:
任何人都可以帮我用这个批处理代码? 不是所有的文件名称是电影(年)[通讯] …,有些只是电影,或电影[通讯]。
总结:我想创build一个基于电影的文件夹,也就是任何具有特定video扩展名的文件,如mp4,mkv,avi等…也不包含:[Extra]; 然后将所有关联的文件移动到该文件夹。
我已经通过这些来源:
虽然你的描述很充足,但是你忘了提供一些具体的细节; 例如:用“电影(年)”部分启动所有文件名? 如果是这样,那么这个批处理文件做你想要的:
编辑 :Ops,我误读了要求! 此版本正常工作:
@echo off setlocal set "basename=." for /F "tokens=1* delims=." %%a in ('dir /B /AD ^| sort /R') do ( set "filename=%%a" setlocal EnableDelayedExpansion for /F "delims=" %%c in ("!basename!") do if "!filename:%%c=!" equ "!filename!" ( set "basename=!filename!" md "!basename!" ) move "!filename!.%%b" "!basename!" for /F "delims=" %%c in ("!basename!") do ( endlocal set "basename=%%c ) )
这样做并不容易,因为你必须对文件名进行排序。 您可以使用dir
指定排序顺序,但不会使用最短的名称。 例如foo.wmv
在foo subtitles.srt
后面是字母,因为空格在点之前。
所以作为一个解决方案,也许你可以有一个包含基本电影名称的“已知扩展名”列表,然后移动所有与它们共享基本名称的文件。 下面的脚本就是这样做的。 它列出所有带有avi
, mp4
和mkv
扩展名的文件,但也许你必须从nfo
开始,这可能适用于许多电影。 该脚本使用这些文件的文件名来制作目录并查找相关文件。 它似乎是做的伎俩,但请在使用它之前做一个备份。 🙂
在这个脚本中的假设是,具有已知扩展名的文件也具有最短的名称。 如果有其他文件具有较短的名称(或不匹配),那么他们将不会被移动到该文件夹。
剧本不完美。 最大的缺点是,如果一个电影包含多个MP4文件,它将为每个文件创建一个文件夹。 但是,如果你做了几次迭代,每次使用不同的扩展按照特定的顺序(以nfo
和其他类似的扩展开头,然后移动电影二进制扩展等),你可能至少能够自动完成大部分工作。
@echo off setlocal REM store current directory. Using separate variable makes it REM easier to change behaviour too. set dir=%cd% REM call subroutine for each supported extension. call :do .info call :do .mp4 call :do .avi call :do .mkv REM Main program done. echo Press a key to close. pause exit /b :do set ext=%1 REM loop through all files with the given extension. for /f "tokens=*" %%f in ('dir /b /on "%dir%\*%ext%"') do ( REM trim the extension and use the base name as directory name. setlocal EnableDelayedExpansion set thefile=%%~nf echo !thefile! md "%dir%\!thefile!" REM move all files that start with the same base name. move "%dir%\!thefile!*.*" "%dir%\!thefile!\" ) REM exit subroutine exit /b
只需在.Bat扩展名中保存下面的代码到实际的源代码中就可以了。
@echo off for %%a in (*.*) do ( md "%%~na" 2>nul move "%%a" "%%~na" ) pause
我认为这将工作,但首先尝试在测试文件夹:
@echo off for %%a in (*.*) do ( md "%%~na" 2>nul move "%%a" "%%~na" ) cd .. del %%~na pause
编辑:我改变了代码,批处理和bash的混合语法。