[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理将目录下txt文件移动到以txt文件第一个连续字母命名的文件夹中

将目录下txt文件移动到该目录下子文件夹{以txt文件第一个连续字母命名的,连续字母不包含一个字母的}中,如果没有就创建这个文件夹并且移动。
例如
将"123_zhangsan456@张三abc.tx"t移动到"zhangsan"文件夹中,
将"h-123lisi@李四.txt"移动到"lisi"文件夹中

本帖最后由 77七 于 2024-6-11 12:34 编辑
  1. @echo off
  2. cd /d "%~dp0"
  3. set az=qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5. set f=%%i
  6. call :1 "%%~ni"
  7. )
  8. pause
  9. exit
  10. :1
  11. set "str=/%~1\"
  12. for /f "tokens=1* delims=%az%" %%a in ("%str%") do (
  13. set str_s=%%a
  14. set str_e=%%b
  15. )
  16. call set "str_m=%%str:%str_s%=%%"
  17. if "%str_e%" neq "" (
  18. call set "str_m=%%str_m:%str_e%=%%"
  19. )
  20. if "%str_m%" neq "" (
  21. if "%str_m:~1%" equ "" (
  22. if "%str_e%" neq "" (
  23. call :1 "%str_e%"
  24. )
  25. ) else (
  26. md "%str_m%" 2>nul
  27. echo move "%f%" "%str_m%\"
  28. move "%f%" "%str_m%\"
  29. )
  30. )
  31. exit /b
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-6-10 22:35 编辑

回复 1# cckkaa888

给一个直接用递归方法 ‘截取文件名第一个多字母字段’ 的版本
以下代码存为 test.bat 置于目标文件(*.txt)所在目录下运行...
  1. @echo off
  2. for /f "delims=" %%a in ('dir /b/a-d *.txt') do (
  3. set "s=%%a"&set "$a=%%a" &setlocal enabledelayedexpansion
  4. set "_s="&set "_k=" & (call :getstr)
  5. md "!_s!" 2>nul & move /y "!$a!" "!_s!\" & endlocal
  6. )
  7. pause&exit/b
  8. :getstr
  9. set "c=!s:~,1!" &if "!c!" geq "a" if "!c!" leq "Z" (
  10. set "s=!s:~1!"&set "_s=!_s!!c!"&set/a "_k+=1" & goto :getstr)
  11. if !_k! geq 2 (exit/b) else (set "s=!s:~1!"&set "_s="&set "_k=" & goto :getstr)
  12. exit/b
复制代码

TOP

回复 2# 77七


   去除多余判断,优化下逻辑...
  1. @echo off
  2. cd /d "%~dp0"
  3. set az=qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM
  4. for /f "delims=" %%i in ('dir /b /a-d *.txt') do (
  5. set f=%%i
  6. call :1 "%%~ni"
  7. )
  8. pause
  9. exit
  10. :1
  11. set "str=/%~1\"
  12. for /f "tokens=1* delims=%az%" %%a in ("%str%") do (
  13. if "%%b" neq "" (
  14. call set "str=%%str:%%a=%%"
  15. call set "str=%%str:%%b=%%"
  16. setlocal enabledelayedexpansion
  17. if "!str:~1!" equ "" (
  18. endlocal
  19. call :1 "%%b"
  20. ) else (
  21. md "!str!" 2>nul
  22. echo move "!f!" "!str!\"
  23. move "!f!" "!str!\"
  24. endlocal
  25. )
  26. )
  27. )
  28. exit /b
复制代码
bat小白,请多指教!谢谢!

TOP

  1. echo "a123bcd4sd" | grep -Eo "[a-zA-Z]{2,}"
复制代码

TOP

本帖最后由 newswan 于 2024-6-12 09:36 编辑

Powershell
  1. $sour = "D:\work"
  2. Push-Location -Paht $sour
  3. Get-ChildItem -Filter "*.txt" | ForEach-Object {
  4. $str = $_.BaseName -replace ".*?([a-zA-Z]{2,}).*",'$1'
  5. if ( -Not ( Test-Path $str ) ) {
  6. New-Item -Type Directory -Path $str
  7. }
  8. Move-Item -Path $_ -Destination $str
  9. }
  10. Pop-Location
复制代码

TOP

本帖最后由 aloha20200628 于 2024-6-12 15:17 编辑


凡是提供正则匹配替换方法的脚本(如jscript/vbs/powershell/python/...)均可增援纯P代码以便其整个脚本代码轻量化...
以下代码调用jscript正则替换方法,存为test.bat,置于目标文件(*.txt)所在目录下运行...
  1. @set @x=1 /* &@echo off
  2. for /f "delims=" %%a in ('dir /b/a-d *.txt') do for /f "delims=" %%d in (
  3. ' cscript /nologo /e:jscript "%~f0" "%%a" ') do (md "%%d" 2>nul & move /y "%%a" "%%d\")
  4. pause&exit/b */
  5. v = WSH.arguments; WSH.echo(v(0).match(/[a-z]{2,}/i)[0]); WSH.quit();
复制代码

TOP

本帖最后由 WHY 于 2024-6-13 08:13 编辑
  1. PowerShell "dir *.txt -file | ?{$_.BaseName -match '[a-z]{2,}'} | forEach {$fd=$matches[0]; md $fd -ea SilentlyContinue; mv $_.FullName -Dest $fd}"
复制代码
  1. @if(0)==(0) echo off
  2. for /f "tokens=1*" %%i in ('dir /b /a-d *.txt ^| cscript -nologo -e:jscript "%~f0"') do (
  3.     md %%i\ 2>nul
  4.     move "%%j" %%i\
  5. )
  6. pause & exit/b
  7. @end
  8. while (!WSH.StdIn.AtEndOfStream) {
  9.     var f = WSH.StdIn.ReadLine();
  10.     var m = f.slice(0,-3).match(/[a-z]{2,}/i);
  11.     if(m) WSH.Echo(m[0] + ' ' + f);
  12. }
复制代码

TOP

返回列表