这可能是一个具体案例,但鉴于正确的代码,我相信很多人可以从中获取。
我在一个文件夹中有数千个文件需要拆分成多个文件夹。每个文件夹需要比之前的文件多1个文件,并且需要这样命名。每个文件夹至少需要X
个文件。例如,如果每个文件夹必须至少有一个文件,那么最终结果可能是这样的:
U:\Batch\Original\ -->
file1.xml
file2.xml
file3.xml
file4.xml
file5.xml
file6.xml
U:\Batch\Processed\ -->
folder1.1 -->
file1.xml
folder2.2 -->
file2.xml
file3.xml
folder3.3 -->
file4.xml
file5.xml
file6.xml
我已经开始attempting this on my own,但我觉得我离开了。假设我在每个文件夹中至少需要1000个文件。如何在.bat
程序中执行此操作?
答案 0 :(得分:1)
你走了。这应该处理它。
@echo off
setlocal enabledelayedexpansion
set /a "minimum=1000, outer=minimum, inner=1"
set folder_prefix=folder
call :mkfolder
:: dir list, order by name, exclude directories, exclude this batch script
for /f "delims=" %%I in ('dir /b /o:n /a:-d ^| findstr /v "%~nx0"') do (
if !inner! GTR !outer! (
set /a "inner=1, outer+=1"
call :mkfolder
)
copy "%%I" "!folder!" >NUL
set /a "inner+=1"
)
:: rename final directory to reflect the number of files contained within
for /f "delims=" %%I in ("%folder%") do set "to=%%~dpnI"
set /a "inner-=1"
ren "%folder%" "%to%.%inner%"
goto :EOF
:mkfolder
set folder=%folder_prefix%!outer!.!outer!
if not exist "!folder!" mkdir "!folder!"
goto :EOF
答案 1 :(得分:1)
你走在正确的轨道上。为了演示,首先我们需要创建一些文件来使用:
md c:\y
cd /d c:\y
for %i in (1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30) do echo.>%i.txt
现在我们可以从c:\y
运行以下批处理文件来创建子文件夹并按照您的指示复制文件(但在此示例中将3作为最小文件):
@echo off
setlocal EnableDelayedExpansion
set cnt=1
set fldr=1
set min=3
for %%i in (*.txt) do (
if !cnt! GTR !min! (
set /a cnt-=1
ren folder!fldr! folder!fldr!.!cnt!
set cnt=1
set /a fldr+=1
set /a min+=1
)
md folder!fldr! > nul 2>&1
copy "%%i" folder!fldr!
set /a cnt+=1
)
set /a cnt-=1
ren folder!fldr! folder!fldr!.!cnt!