进一步阅读:

进一步阅读:

我创建了一个批处理文件,用于将一个目录中的文件放入名为 1、2、3 等的子文件夹中,但前提是子文件夹中的文件少于 1000 个。我为每个文件夹创建了一个批处理文件,它会调用所有 100 个

setlocal enabledelayedexpansion
set count=1
for /f %%f in ('dir /b P:\InstaPics\1\') do set /a count+=1
if %count% geq 1000 exit /b
for /f %%f in ('dir /b P:\InstaPics\') do set jn=%%f && call :sub
:sub 
if %count% geq 1000 exit /b
set /a jnum+=1
robocopy /mov P:\InstaPics\ P:\InstaPics\1\ %jn%
set /a count+=1
if %count% geq 1000 exit /b
:die

问题是,当达到 1000 个文件后,它会停止复制,但会继续迭代,如下所示。有没有什么办法可以让它停止?迭代尚未放入子文件夹的其他 10,000 个文件需要一段时间

仍在迭代文件

答案1


您的变量%count%和,%jnum%它们%jn%在您的函数中不存在(没有值,未被访问):sub

如果将它们传递给变量,它们就存在:

call :sub "%file%" "%path%" "string"

:sub
echo\ My variable file is argument #1: %1
echo\ My variable path is argument #2: %2  
echo\ My simple string is argument #3: %3

仅仅调用一个函数是不够的,如果在函数内部您将使用变量
(已定义),则需要传递这些变量以便
在函数内访问/使用它们......


对原始代码进行尽可能小的更改,并使用/传递参数给标签/函数:sub,它将是:

@echo off 

setlocal enabledelayedexpansion
set count=1

for /f %%f in ('dir /b P:\InstaPics\1\') do set /a count+=1
if %count% geq 1000 exit /b

for /f "delims=" %%f in ('dir /b P:\InstaPics\') do call :sub %count% "%%~f" && set /a count+=1

:sub 
if "%~1" == "" (endlocal && echo\done!)

if %~1 lss 1000 (
     set /a jnum+=1
     robocopy /mov P:\InstaPics\ P:\InstaPics\1\ "%~2"
    ) else endlocal && echo\done!
    
exit /b
    
:die
rem: continue... ???

  • 不使用标签/功能来完成主要任务的替代方法:
@echo off 

setlocal enabledelayedexpansion

pushd "P:\InstaPics\1\." && set /a _jn=0,_cnt=0

for /f "delims=" %%f in ('dir /b /a:-d .\* ^| find /v /c ""'
    )do if %%f geq 1000 (popd & endlocal & exit /b)else set "_cnt=%%~f"

for %%f in ("P:\InstaPics\*")do set /a "_jn+=1,_cnt+=1" && (
     robocopy /mov /l /njh /njs "%%~dpf\." .\ "%%~nxf"
     if !_jn! geq 1000 goto %:^)
    )

%:^)
popd & timeout /t 5 | echo\!_cnt!/!_jn! & endlocal & exit /b

进一步阅读:

相关内容