本帖最后由 hfxiang 于 2022-8-15 07:57 编辑
需要:每隔一段时间会收到一百多个压缩数据包,每个包当中有不确定个数的文件,解压后还存在子文件夹,之前无重名文件,就用以下简单指令(直接在cmd命令行下执行)即可把文件从子文件夹移动到当前文件夹,- for /r %a in (*) do move /y "%a" .
复制代码 之后删除所有子文件夹即可。
但随着文件数量增加,出现许多重名文件,以上指令将会用新文件覆盖原有的同名文件,故写了以下脚本(详见“3.移动文件到当前文件夹代码”)来解决,但总觉得其执行效率实在太低(不作信息回显提升亦不明显),希望有大神能给予优化,或指引一下更简单其它有效方法,不胜感激。
创建测试文件需用到第3方工具seq.exe,下载地址:http://bcn.bathome.net/tool/seq.exe
1.创建100个文件夹(直接在cmd命令行下执行)- (for /f "usebackq tokens=*" %a in (`seq -f "%cd%\Folder%03g" 1 100 2^>nul`) do @mkdir "%a")>nul 2>&1
复制代码 2.在每个子文件夹下创建10个(空)文件(test001.dat~test010.dat)(直接在cmd命令行下执行)- (for /d %a in ("%cd%\*") do @for /f "usebackq tokens=*" %b in (`seq -f "%a\test%03g.dat" 1 10 2^>nul`) do @echo;2>%b)>nul 2>&1
复制代码 3.移动文件到当前文件夹代码(也就是希望优化或另劈方法的地方)- @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 (
- call :No_DupFile "%%~na" "%%~xa" newFileName Check
- if /i [!Check!]==[True] set "exist_File_!newFileName!=True"
- set new_FileName=%cd%\!newFileName!
- )
- 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 <oldFileName> <extName> [newFileName] [Check_ID]
- setlocal enableDelayedExpansion
- set "Check=False"
- for /l %%b in (1,1,999) do (
- set n=00%%b
- set n=!n:~-3!
- if not defined exist_File_%~1__!n!%~2 (
- set "FileName=%~1__!n!%~2"
- set "Check=True"
- goto :end_Loop
- )
- )
- :end_Loop
- endlocal&set "%3=%FileName%"&set "%4=%Check%"&goto :EOF
复制代码
|