我抬起头来......
现在我有一个包含空子文件夹和图片的文件夹。
这些图片被随机命名为相机生成的默认名称。
如果我想将这些图片分成几批,然后将它们移动到子文件夹
例如:
总而言之,我总共有100张图片和5个子文件夹。前20张图片进入subfolder_1
后续25张图片进入子文件夹_2
后续23张图片进入subfolder_3
后续12张图片进入subfolder_4
最后剩余的20张图片进入subfolder_5
所以,我想在循环中做这件事。由于图片数量不恒定,我打算提示用户每次定义要移动的图片数量。
我无法弄清楚的主要问题是如何控制完成的数量?
我知道使用GOTO函数来破坏FOR循环。但我不知道如何在我的情况下这样做。
事实上,我现在仍然坚持我现在拥有的这个概念,我试图使用更短的FOR循环来包含更长的FOR循环:
(这只是尝试将前20张图片放入子文件夹_1)
FOR / L %% A in(1,1,20)Do(
FOR %% B in("%dir_of_folder_which_contains_the_pictures_and_subfolders%\ *")Do(
MOVE * .jpg subfolder_1
)
)
这些代码不起作用。也许它必须使用GOTO功能?有人可以帮忙吗?感谢很多..
答案 0 :(得分:0)
@echo off
setlocal enableextensions enabledelayedexpansion
set "folder=%cd%"
rem For each of the present subfolders
for /d %%a in ("%folder%\*") do (
rem Count the number of remaining files
set "nFiles=0"
for /f %%b in ('dir "%folder%\*" /a-d /b 2^>nul ^| find /c /v ""') do set "nFiles=%%b"
if !nFiles! lss 1 goto :done
rem Ask the number of files to move
echo(
echo(There are !nFiles! files left. How many to move to %%a ?
set "nFiles=0"
set /p "nFiles="
set /a "nFiles+=0" 2>nul
rem Move the indicated number of files
if !nFiles! gtr 0 for %%c in ("%folder%\*") do if defined nFiles (
echo move "%%~fc" "%%~fa"
set /a "nFiles-=1"
if !nFiles! equ 0 set "nFiles="
)
)
:done
endlocal
exit /b
不是最有效的代码,但这是构建的基本框架。 move
命令以echo
为前缀进行测试。如果输出到控制台是正确的,请删除echo
。
答案 1 :(得分:0)
使用数据结构(如数组或列表)可以更好地解决这类问题。例如:
@echo off
setlocal EnableDelayedExpansion
rem Initialize counters
set /A numFolders=0, numFiles=0
rem Save file names in an array
for %%a in (*.*) do (
set /A numFiles+=1
set "file[!numFiles!]=%%a"
)
rem Save folder names in a list
set "list="
for /D %%a in (*) do (
set /A numFolders+=1
set "list=!list! %%a"
)
rem Ask the user for the distribution
:askDistribution
echo There are %numFiles% files and %numFolders% folders
echo Enter the number of files for each folder (must sum %numFiles%)
echo Folders: %list%
set /P "distribution=Files: "
set total=0
for %%a in (%distribution%) do set /A total+=%%a
if %total% neq %numFiles% goto askDistribution
rem Distribute the files
set i=0
for %%n in (%distribution%) do (
rem Get current folder and shift the rest
for /F "tokens=1*" %%a in ("!list!") do (
set folder=%%a
set list=%%b
)
rem Move the files
for /L %%i in (1,1,%%n) do (
set /A i+=1
for /F %%i in ("!i!") do ECHO move "!file[%%i]!" !folder!
)
)
有关详细信息,请参阅:Arrays, linked lists and other data structures in cmd.exe (batch) script