批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

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

批处理是把指定文件夹里面的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. )
复制代码

回复 1# 541622092


思路是根据文件名的规律分开处理,例如:
先处理字母a开头的文件,再处理字母b开头的文件......
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我帮忙写的代码不需要付钱,也不用找我要支付宝或微信账号。如果一定要给,请在群里给大家吧。

TOP

试一试将 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

TOP

订正》文件名如有空格须用双引号包裹
@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

TOP

本帖最后由 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)只是一个文件名称,并没有路径,所以代码执行时存在找不到对象的情况。

TOP

感谢以上各位的帮助,脚本开始工作了,感谢!

TOP

如果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
复制代码
目的,学习批处理

TOP

返回列表