找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 64658|回复: 19

[文件操作] 请问批处理如何根据部分文件名新建文件夹

[复制链接]
发表于 2023-3-7 17:43:34 | 显示全部楼层 |阅读模式
有一堆文件混在一起了,文件名分别是:
dddd-123.zip
zzzzzzz-123.zip
aaa-123.zip

我希望能够先获取文件名到变量,然后将变量的-符号作为截取位置,将前面的字符作为文件夹名称,在别处新建,然后将对应的文件移动过去。

没想明白应该怎么解决前2步。

特此求教。
发表于 2023-3-7 17:55:50 | 显示全部楼层
回复 1# 惆怅而又凄凉


请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
  1. @echo off
  2. cd /d "%~dp0"
  3. for /f "tokens=1* delims=-" %%a in ('dir /b /a-d *.zip') do (
  4.     echo 正在处理文件:%%a
  5.     if not exist "%%a" (
  6.         md "%%a"
  7.     )
  8.     move "%%a-%%b" "%%a"
  9. )
复制代码
 楼主| 发表于 2023-3-8 02:35:38 | 显示全部楼层
回复 2# Batcher


    感谢解答,我的主要问题是:
假设文件名是32132-aadjoig.zip

我本来考虑的是
1、遍历文件名,将文件名写入变量。
2、将变量字符串从“-”前面截取。
3、在指定位置建立文件夹为变量。
4、将该文件移至该文件夹。

但我没找到字符串按关键字截取的命令,还望再指教一二,谢谢!
发表于 2023-3-8 09:23:37 | 显示全部楼层
回复 3# 惆怅而又凄凉
  1. @echo off
  2. cd /d "%~dp0"
  3. for %%a in (*.zip) do (
  4.     echo 正在处理文件:%%a
  5.     set "FileName=%%a"
  6.     set "NameRight=!FileName:*-=!"
  7.     call set "NameLeft=%%FileName:-!NameRight!=%%"
  8.     if not exist "!NameLeft!" (
  9.         md "!NameLeft!"
  10.     )
  11.     move "%%a" "!NameLeft!"
  12. )
复制代码
 楼主| 发表于 2023-3-8 11:45:03 | 显示全部楼层
本帖最后由 惆怅而又凄凉 于 2023-3-8 11:52 编辑
回复  惆怅而又凄凉
Batcher 发表于 2023-3-8 09:23



    非常感谢解答!真的是醍醐灌顶。。。

看是看懂了,但不知道为啥出错,然后我做了中断和echo,结果是空的

  1. cd /d "%~dp0"
  2. for %%a in (*.jpg) do (
  3.     echo 正在处理文件:%%a
  4.     set "FN=%%a"
  5.     set "FNR=!FN:*-=!"
  6.     call set "FNL=%%FN:-!FNR!=%%"
  7.     echo name = %%a
  8.     echo fn = %FN%
  9.     echo fnr = %FNR%
  10.     echo fnl = %FNL%
  11. pause
  12. )
复制代码

  1. 正在处理文件:a-123456.jpg
  2. name = a-123456.jpg
  3. fn =
  4. fnr =
  5. fnl =
  6. 请按任意键继续. . .
复制代码
发表于 2023-3-8 12:16:55 | 显示全部楼层
本帖最后由 77七 于 2023-3-8 12:32 编辑

回复 5# 惆怅而又凄凉


   在代码的开头加一句
  1. setlocal enabledelayedexpansion
复制代码
文件名含 感叹号就在 for语句内加
  1. cd /d "%~dp0"
  2. for %%a in (*.jpg) do (
  3.     echo 正在处理文件:%%a
  4.     set "FN=%%a"
  5.     setlocal enabledelayedexpansion
  6.     set "FNR=!FN:*-=!"
  7.     call set "FNL=%%FN:-!FNR!=%%"
  8.     echo name = %%a
  9.     echo fn = !FN!
  10.     echo fnr = !FNR!
  11.     echo fnl = !FNL!
  12.     endlocal
  13.     pause
  14. )
复制代码
 楼主| 发表于 2023-3-8 13:05:27 | 显示全部楼层
回复  惆怅而又凄凉


   在代码的开头加一句文件名含 感叹号就在 for语句内加
77七 发表于 2023-3-8 12:16



    也试过了,不是这个原因。
发表于 2023-3-8 13:07:32 | 显示全部楼层
回复 7# 惆怅而又凄凉


请参考Q-13:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
发表于 2023-3-8 13:15:00 | 显示全部楼层
回复 7# 惆怅而又凄凉


   请直接复制6楼我帮你修改的代码,我测试是正常的
 楼主| 发表于 2023-3-8 13:47:26 | 显示全部楼层
回复  惆怅而又凄凉


   请直接复制6楼我帮你修改的代码,我测试是正常的
77七 发表于 2023-3-8 13:15



    真的耶。。。
问题不单单是延迟变量,还有变量符号,如果是叹号就正常了。

非常感谢!
 楼主| 发表于 2023-3-8 13:48:12 | 显示全部楼层
回复  惆怅而又凄凉


请参考Q-13:
Batcher 发表于 2023-3-8 13:07



谢谢!搞定啦!
真的不是这个空格问题。。。
我去掉空格还是空值。

是延迟变量和变量符号问题。
发表于 2023-3-8 17:49:01 | 显示全部楼层
for /f 完全可以搞定的东西 为什么要变量去变来变去呢
 楼主| 发表于 2023-3-8 19:22:59 | 显示全部楼层
回复 12# terse


    那还请举个例子解答一下?
发表于 2023-3-8 21:13:47 | 显示全部楼层
回复 13# 惆怅而又凄凉
二楼 B大的不能用吗
这个显示和六楼的一样效果吧
  1. @echo off
  2. for /f "tokens=1* delims=-" %%a in ('dir /b /a-d *-*.jpg') do (
  3.     echo 正在处理文件 %%a-%%b
  4.     echo name %%a-%%b
  5.     echo fn %%a-%%b
  6.     echo fnr %%b
  7.     echo fn1 %%a
  8. )
  9. pause
复制代码
 楼主| 发表于 2023-3-9 12:45:10 | 显示全部楼层
本帖最后由 惆怅而又凄凉 于 2023-3-9 13:01 编辑

回复 14# terse


主要我是想学习一下这个左右截取的问题,自己写了半天没折腾出来。

然后你们这套运行起来并不正常,在30万个文件的文件夹里,会一直保持黑屏,直到遍历完全部文件,再一次性处理,但这个过程并不会发生,因为达到一定数量后就直接退出了。
所以我试过运行后黑屏10秒,然后按ctrl+c,再输入N,打断遍历,就会跑掉这10秒遍历的文件。

但是后面这个答案也有个问题,因为变量延迟可能是,每次跑一百万文件后,内存占用超过20G,速度也会下降的很厉害。
所以我理解的就是前者和后者都会因为文件数量太大,导致内存占用过高,但前者是遍历完才操作,后者是遍历中操作。
因此前者无法正常工作,后者工作基本正常,堪用。

所以,后面的那个答案,更符合实际情况。
后来那个方案,昨晚已经跑掉200万文件了,还剩900万。
没出错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 22:07 , Processed in 0.022983 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表