我创建了一个批处理文件,用于将一个目录中的文件放入名为 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