Board logo

标题: [文件操作] 批处理脚本求优化?运行一天一夜了还没开始操作。。。 [打印本页]

作者: 541622092    时间: 2022-5-8 01:47     标题: 批处理脚本求优化?运行一天一夜了还没开始操作。。。

批处理是把指定文件夹里面的txt文件,按文件名称的第一字符放入对应的文件夹
文件夹里面有四百多万个txt,执行下面批处理已经一天一夜了,还没开始移动
求大侠看下,是否能优化?
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b /a-d "e:\web\img\*.txt"') do (
  3.     set str=%%i
  4.     set folder=!str:~0,1!
  5.     md "!folder!" 2>nul
  6.     move /y "%%i" "!folder!" >nul
  7. )
复制代码

作者: Batcher    时间: 2022-5-8 11:36

回复 1# 541622092


思路是根据文件名的规律分开处理,例如:
先处理字母a开头的文件,再处理字母b开头的文件......
作者: aloha20200628    时间: 2022-5-8 11:42

试一试将 dir 简报移出 for...in ()
@echo off
cd /d e:\web\img
dir /b/a-d *.txt>alltxt.lst
setlocal enabledelayedexpansion
for /f "delims=" %%F in (alltxt.lst) do (
        set "nF=%%F" & set "folder=!nF:~,1!"
        if not exist "!folder!" (md "!folder!")
        move /y !nF! "!folder!">nul
)
endlocal & del/q alltxt.lst
作者: aloha20200628    时间: 2022-5-8 11:53

订正》文件名如有空格须用双引号包裹
@echo off
cd /d e:\web\img
dir /b/a-d *.txt>alltxt.lst
setlocal enabledelayedexpansion
for /f "delims=" %%F in (alltxt.lst) do (
        set "nF=%%F" & set "folder=!nF:~,1!"
        if not exist "!folder!" (md "!folder!")
        move /y "!nF!" "!folder!">nul
)
endlocal & del/q alltxt.lst
作者: yakeyun    时间: 2022-5-8 14:48

本帖最后由 yakeyun 于 2022-5-8 14:52 编辑

回复 1# 541622092
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%i in ('dir /a /s /b "e:\web\img\*.txt"') do (
  3.     set dvn=%%i
  4.     set str=%%~ni
  5.     set folder=!str:~0,1!
  6.     md "!folder!" 2>nul
  7.     move /y "!dvn!" "!folder!" >nul
  8. )
  9. exit
复制代码
你之前的moved对象(%%i)只是一个文件名称,并没有路径,所以代码执行时存在找不到对象的情况。
作者: 541622092    时间: 2022-5-8 15:39

感谢以上各位的帮助,脚本开始工作了,感谢!
作者: hlzj88    时间: 2022-5-8 15:49

如果txt文件名是字母的可以这样
  1. for /f %%i in (a b c 省略26个字母) do md %%i&&move /y "e:\web\img\%%i*.txt" %%i\
复制代码
如果txt文件名是汉字的,可以这样,代码借用aloha20200628的源码,进行了修改
这样的目的是找到一个字,把开头含这个字的所有txt一次全部移动。我写代码一次成功率不高,没有测试。
  1. @echo off&setlocal enabledelayedexpansion
  2. cd /d e:\web\img
  3. del /q *.lst>nul 2>nul
  4. dir /b/a-d *.txt>>alltxt.lst
  5. :xh
  6. for /f "delims=" %%F in (alltxt.lst) do (
  7.         set "nF=%%F" & set "folder=!nF:~,1!"
  8.         if not exist "!folder!" (md "!folder!")
  9.         move /y "!folder!*.txt" "!folder!\">nul
  10.        findstr /v /ibc:"!folder!" alltxt.lst>>yu.lst
  11.        move /y yu.lst alltxt.lst>nul
  12.        goto xh
  13.     )
  14. pause
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2