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

[文件操作] 求助批处理进行图片整理归类的问题

问题是这样,现在一个文件夹内有较大量图片(大概一个文件夹内有100-250张,图片格式为.jpg格式)
图片名称例:
0313-RS ·0010-0001-1-1-001.jpg
0313-RS ·0010-0001-1-2-001.jpg
0313-RS ·0010-0001-1-2-002.jpg
0313-RS ·0010-0001-3-1-001.jpg
0313-RS ·0010-0001-3-1-002.jpg
0313-RS ·0010-0001-3-2-001.jpg
0313-RS ·0010-0001-3-2-002.jpg
0313-RS ·0010-0001-9-1-1-001.jpg
0313-RS ·0010-0001-9-1-2-001.jpg
0313-RS ·0010-0001-9-1-3-001.jpg
0313-RS ·0010-0001-10-1-001.jpg
0313-RS ·0010-0001-10-2-001.jpg

现在需要在图片所在文件夹内创建新文件夹,并以图片名称的除过后四位的其他名称部分命名,
如:
0313-RS ·0010-0001-1-1-001.jpg       移动到    0313-RS ·0010-0001-1-1   文件夹内
0313-RS ·0010-0001-1-2-001.jpg       移动到    0313-RS ·0010-0001-1-2   文件夹内
0313-RS ·0010-0001-1-2-002.jpg       移动到    0313-RS ·0010-0001-1-2   文件夹内(和上一个为同一个文件夹)
0313-RS ·0010-0001-3-1-001.jpg       移动到    0313-RS ·0010-0001-3-1   文件夹内
0313-RS ·0010-0001-3-1-002.jpg       移动到    0313-RS ·0010-0001-3-1   文件夹内(和上一个为同一个文件夹)
0313-RS ·0010-0001-3-2-001.jpg       移动到    0313-RS ·0010-0001-3-2   文件夹内
0313-RS ·0010-0001-3-2-002.jpg       移动到    0313-RS ·0010-0001-3-2   文件夹内(和上一个为同一个文件夹)
0313-RS ·0010-0001-9-1-1-001.jpg    移动到    0313-RS ·0010-0001-9-1-1   文件夹内
0313-RS ·0010-0001-9-1-2-001.jpg    移动到    0313-RS ·0010-0001-9-1-2   文件夹内
0313-RS ·0010-0001-9-1-3-001.jpg    移动到    0313-RS ·0010-0001-9-1-3   文件夹内
0313-RS ·0010-0001-10-1-001.jpg     移动到    0313-RS ·0010-0001-10-1   文件夹内
0313-RS ·0010-0001-10-2-001.jpg     移动到    0313-RS ·0010-0001-10-2   文件夹内(和上一个为同一个文件夹)

例子举的比较多,但规律比较简单,

我在这里自学了两天(发现了宝藏论坛^_^),思路是这样:
先新建文件夹以每张照片名命名(有多少照片就建立多少文件夹),然后把每张照片分别移动到各相应的文件夹内:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /r %%i in (*)do if not exist "%%~ni" if not "%%i"==%0 md "%%~ni"&move "%%i" "%%~ni"
复制代码
再把需要放到一个文件夹的照片连同文件夹移动到同一个文件夹内:
  1. @echo off&setlocal EnableDelayedExpansion
  2. for  /d %%i in (*) do (set a=%%i
  3. set b=!a:~0,-4!
  4. move %%i !b!
  5. )
复制代码
再把调整文件夹内的照片,删掉多余的文件夹(网上抄大佬的,看不懂,不过能用,哈哈):
  1. <# :
  2. @echo off
  3. rem 增强代码兼容性,代码保存为 ".bat"、".cmd"、".ps1"均可执行
  4. powershell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  5. more +8 %~f0 > %~dpn0.ps1
  6. powershell %~dpn0.ps1
  7. del %~dpn0.ps1&pause&exit /b
  8. #>
  9. foreach ($dir in @(dir .\*\*\*))
  10. {
  11.     $count = 0
  12.     foreach ($file in @(dir $dir))
  13.     {
  14.         if ($file.Extension -eq ".jpg"){
  15.             if (! $file.PSIsContainer){
  16.                 if ($dir.Parent){
  17.                     $count += 0
  18.                     $new_file = -Join($dir.name,$file.Extension)
  19.                     $dest = -Join(".\",$dir.Parent.Parent,"\",$dir.Parent,"\",$new_file)
  20.                     $file.Moveto($dest)
  21.                     write-host 正在移动:$file
  22.                     if( (Get-ChildItem $dir | Measure-Object).Count -eq 0) {
  23.                         rd $dir
  24.                         write-host 删除目录:$dir
  25.                     }
  26.                 }
  27.             }
  28.         }
  29.     }
  30. }
复制代码
到这这个文件夹内处理完了,手动再修改这个总文件夹名称为:
0313-RS ·0010-0001

这就处理完了一个。麻烦的是第一个代码和第二个代码是放进这个文件夹运行的,大佬给的这个是放到文件夹上一级运行的,虽然比纯手改要方便很多,但我还是想问下能不能用一个批处理指令一次完成这么多任务,最好是能一次运行完成多个,可以的话再使用批处理修改下总文件夹的名称。
还有个问题就是发现这三个代码或许有bug,同样需处理的文件,有的运行没反应,有的却可以,不知道是什么原因。麻烦大家帮忙看看,谢谢大家。
能力水平有限,想到的这个思路可能不是最完美的,或许有更好的解决办法,能提供的话在此不胜感激。

回复 1# liyu963926475
  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
  3.     for /f "tokens=1-5 delims=-" %%a in ("%%~ni") do (
  4.         if not exist "%%a-%%b-%%c-%%d-%%e" (
  5.             md "%%a-%%b-%%c-%%d-%%e"
  6.         )
  7.         move "%%i" "%%a-%%b-%%c-%%d-%%e"
  8.     )
  9. )
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# Batcher

您好,大佬,您这短短几行就可以代替我三段代码,真是让我佩服的五体投地,就是还有点小小的问题。

例子内:
0313-RS ·0010-0001-9-1-1-001.jpg    移动到    0313-RS ·0010-0001-9-1-1   文件夹内
0313-RS ·0010-0001-9-1-2-001.jpg    移动到    0313-RS ·0010-0001-9-1-2   文件夹内
0313-RS ·0010-0001-9-1-3-001.jpg    移动到    0313-RS ·0010-0001-9-1-3   文件夹内
   
这些是分别放进三个文件夹的,而不是放进同一个文件夹。
而且最后的数字还有可能会有十位数的,如下:
0313-RS ·0010-0001-9-1-60-001.jpg    移动到    0313-RS ·0010-0001-9-1-60   文件夹内

TOP

是太难了吗。。。有没有大佬愿意指教一下的呀。。感谢!!!

TOP

本帖最后由 WHY 于 2020-12-2 10:04 编辑
  1. PowerShell "dir *-*.jpg | forEach {$fd = $_.Name -replace '^(.+)-[^-]+$', '$1'; if(![IO.Directory]::Exists($fd)){$null=md $fd}; mv $_.FullName -dest $fd -Force}"
复制代码
1

评分人数

TOP

回复 5# WHY


    这...一句都没看懂,但效果很好,看来我学习批处理还有很长一段路要走。感谢

TOP

回复 6# liyu963926475


5楼是PowerShell脚本,如果感兴趣的话可以参考以下教程:
http://bbs.bathome.net/thread-26220-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表