2

这可能是一个特定的案例,但如果有正确的代码,我相信很多人都可以从中受益。

我在一个文件夹中有数千个文件,需要拆分为多个文件夹。每个文件夹需要比之前的文件多 1 个文件,并且需要这样命名。每个文件夹都需要至少有X数量的文件。例如,如果每个文件夹必须至少有 1 个文件,最终结果可能如下所示:

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

我已经开始自己尝试这个,但我觉得我很遥远。假设我在每个文件夹中至少需要 1000 个文件。如何在.bat程序中执行此操作?

4

2 回答 2

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!
于 2013-03-18T15:59:24.913 回答
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
于 2013-03-18T15:57:04.827 回答