|
|
楼主 |
发表于 2022-8-14 18:39:48
|
显示全部楼层
几经寻找,从DOS Batch - Function Tutorial( https://www.dostips.com/DtTutoFu ... .RecursiveFunctions )中得到启示,使用递归方式处理,子过程避免使用 setlocal enableDelayedExpansion 启用 "延迟环境变量扩展" ,运行性能出现明显提升,请大神们指导。改进后代码如下:
- @echo off
- setlocal enableDelayedExpansion
- set /a fn0=0
- set /a fn1=0
- set /a fn2=0
- set /a fn3=0
- set "Folder=%~dp0"
- set "Dir_a=%~a1"
- if defined Dir_a if "[%Dir_a:~0,1%]"=="[d]" (
- set "Folder=%~f1"
- ) else (
- set "Folder=%~dp1"
- )
- if /i "[%Folder:~-1,1%]"=="[\]" if /i not "[%Folder:~-2,1%]"=="[:]" set "Folder=%Folder:~0,-1%"
- cd /d "%Folder%"
- for /f "delims==" %%a in ('set exist_File_ 2^>nul') do set "%%a="
- for /f %%a in ('dir /b/a-d') do set "exist_File_%%a=True"
- for /f %%a in ('dir /b/a-d/s') do if /i not [%%~dpa]==[%cd%\] (
- set "Check=True"
- if not defined exist_File_%%~nxa (
- set "exist_File_%%~nxa=True"
- set new_FileName=%cd%\%%~nxa
- ) else (
- set /a P_Serial=0
- call :No_DupFile "%%~na","%%~xa",P_Serial,Serial
- set "exist_File_%%~na__!Serial!%%~xa=True"
- if !P_Serial! GTR 999 set "Check=False"
- set new_FileName=%cd%\%%~na__!Serial!%%~xa
- )
- set /a fn0+=1
- echo;!fn0! "%%a" --^> "!new_FileName!"
- if /i [!Check!]==[True] (
- (
- move /y "%%a" "!new_FileName!">nul 2>&1
- ) && (
- set /a fn1+=1
- echo; 移动成功
- ) || (
- set /a fn2+=1
- echo; 移动失败
- )
- ) else (
- set /a fn3+=1
- echo; 改名失败
- )
- )
- echo;
- if %fn0% GTR 0 echo;发现文件: %fn0% 个
- if %fn1% GTR 0 echo;移动成功: %fn1% 个文件
- if %fn2% GTR 0 echo;移动失败:%fn2% 个文件
- if %fn3% GTR 0 echo;改名失败:%fn3% 个文件
- endlocal
- echo;&pause
- exit /b
- :No_DupFile <FileName>,<extName>,[P_Serial],[Serial]
- setlocal
- set /a P_Serial=1+%~3
- set Serial=00%P_Serial%
- set Serial=%Serial:~-3%
- if %P_Serial% LEQ 999 if defined exist_File_%~1__%Serial%%~2 call :No_DupFile "%~1","%~2",P_Serial,Serial
- (endlocal
- SET "%3=%P_Serial%"
- SET "%4=%Serial%"
- )
- goto :EOF
复制代码 |
|