我需要一个批处理文件脚本,将所有文件从一个父文件夹移动到尽可能多的子文件夹中,只要每个子文件夹接收批处理文件或命令行中指定的最大文件数量即可。换句话说,脚本必须将父文件夹中的所有文件分发到其下的多个子文件夹中(脚本必须自动创建这些子文件夹),将文件移动到许多X文件(其中“X“是每个子文件夹将接收的文件数量)。
额外要求:
子文件夹名称必须按照以下命名规则创建:001、002、003 等等。
必须支持各种文件名的文件(带有空格、特殊字符或非英语重音符号等)。
必须支持数万个文件的移动。
必须在本地管理员权限下在 Windows 10 Professional 中工作。
例如,假设文件夹“D:\Downloads”中有 2400 个文件,并且您希望将它们分布到每个子文件夹中最多包含 1000 个文件。运行脚本后,将创建以下结构:
D:\Downloads
|__001
|__002
|__003
在哪里:
D:\Downloads --> Will have no files inside it anymore
|__001 --> Will have 1000 files inside it
|__002 --> Will have 1000 files inside it
|__003 --> Will have the last 400 files inside it
文件的顺序(哪个文件进入哪个子文件夹)并不重要,也就是说,移动不需要考虑任何特定标准(例如文件名、大小、文件类型等)。但是,这方面的任何改进都是受欢迎的(例如,将最后创建的文件首先移动到第一个子文件夹的选项)。
有任何想法吗?
更新
这是对我有用的解决方案:
@echo off
setlocal enableextensions
setlocal enabledelayedexpansion
if not %3.==. goto syntax
if %2.==. goto syntax
:: Checks if %2 is a number:
SET "var="&for /f "delims=0123456789" %%i in ("%2") do set var=%%i
if defined var (goto syntax)
if /i %1.==. goto syntax
if /i not exist %1 echo. & echo The folder %1 does not exist... && echo Folder paths must be typed between "quotes" if there's any empty space. && echo. && goto end
setlocal enableextensions
setlocal enabledelayedexpansion
:: Maximum amount of files per subfolder:
SET limit=%2
:: Initial counter (everytime counter is 1, a new subfolder is created):
SET n=1
:: Subfolder counter:
SET nf=0
::Retrieves the amount of files in the specified folder:
set count=0
for %%A in (%1%\*.*) do set /a count+=1
echo.
echo Distributing %count% files in subfolders of up to %2 files...
FOR %%f IN (%1%\*.*) DO (
:: If counter is 1, create a new subfolder with name starting with "00...":
IF !n!==1 (
SET /A nf+=1
MD %1%\00!nf!
)
:: Move files into subfolders with names starting with "00...":
MOVE /-Y "%%f" %1%\00!nf! > NUL
:: Reset counter when a subfolder reaches the maximum file limit:
IF !n!==!limit! (
SET n=1
) ELSE (
SET /A n+=1
)
)
SET limit=
SET n=
SET nf=
SET count=
echo Move finished successfully.
goto end
:syntax
echo.
echo YOU TYPED: movedown %*
echo SYNTAX: movedown ["full path"] (between quotes if there's any space) [n] (maximum number of files per subfolder)
echo.
:end
ENDLOCAL