标题: [文件操作] 请问批处理如何根据部分文件名新建文件夹 [打印本页]
作者: 惆怅而又凄凉 时间: 2023-3-7 17:43 标题: 请问批处理如何根据部分文件名新建文件夹
有一堆文件混在一起了,文件名分别是:
dddd-123.zip
zzzzzzz-123.zip
aaa-123.zip
我希望能够先获取文件名到变量,然后将变量的-符号作为截取位置,将前面的字符作为文件夹名称,在别处新建,然后将对应的文件移动过去。
没想明白应该怎么解决前2步。
特此求教。
作者: Batcher 时间: 2023-3-7 17:55
回复 1# 惆怅而又凄凉
请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA- @echo off
- cd /d "%~dp0"
- for /f "tokens=1* delims=-" %%a in ('dir /b /a-d *.zip') do (
- echo 正在处理文件:%%a
- if not exist "%%a" (
- md "%%a"
- )
- move "%%a-%%b" "%%a\"
- )
复制代码
作者: 惆怅而又凄凉 时间: 2023-3-8 02:35
回复 2# Batcher
感谢解答,我的主要问题是:
假设文件名是32132-aadjoig.zip
我本来考虑的是
1、遍历文件名,将文件名写入变量。
2、将变量字符串从“-”前面截取。
3、在指定位置建立文件夹为变量。
4、将该文件移至该文件夹。
但我没找到字符串按关键字截取的命令,还望再指教一二,谢谢!
作者: Batcher 时间: 2023-3-8 09:23
回复 3# 惆怅而又凄凉 - @echo off
- cd /d "%~dp0"
- for %%a in (*.zip) do (
- echo 正在处理文件:%%a
- set "FileName=%%a"
- set "NameRight=!FileName:*-=!"
- call set "NameLeft=%%FileName:-!NameRight!=%%"
- if not exist "!NameLeft!" (
- md "!NameLeft!"
- )
- move "%%a" "!NameLeft!\"
- )
复制代码
作者: 惆怅而又凄凉 时间: 2023-3-8 11:45
本帖最后由 惆怅而又凄凉 于 2023-3-8 11:52 编辑
回复 惆怅而又凄凉
Batcher 发表于 2023-3-8 09:23
非常感谢解答!真的是醍醐灌顶。。。
看是看懂了,但不知道为啥出错,然后我做了中断和echo,结果是空的- cd /d "%~dp0"
- for %%a in (*.jpg) do (
- echo 正在处理文件:%%a
- set "FN=%%a"
- set "FNR=!FN:*-=!"
- call set "FNL=%%FN:-!FNR!=%%"
- echo name = %%a
- echo fn = %FN%
- echo fnr = %FNR%
- echo fnl = %FNL%
- pause
- )
复制代码
- 正在处理文件:a-123456.jpg
- name = a-123456.jpg
- fn =
- fnr =
- fnl =
- 请按任意键继续. . .
复制代码
作者: 77七 时间: 2023-3-8 12:16
本帖最后由 77七 于 2023-3-8 12:32 编辑
回复 5# 惆怅而又凄凉
在代码的开头加一句- setlocal enabledelayedexpansion
复制代码
文件名含 感叹号就在 for语句内加
- cd /d "%~dp0"
- for %%a in (*.jpg) do (
- echo 正在处理文件:%%a
- set "FN=%%a"
- setlocal enabledelayedexpansion
- set "FNR=!FN:*-=!"
- call set "FNL=%%FN:-!FNR!=%%"
- echo name = %%a
- echo fn = !FN!
- echo fnr = !FNR!
- echo fnl = !FNL!
- endlocal
- pause
- )
复制代码
作者: 惆怅而又凄凉 时间: 2023-3-8 13:05
回复 惆怅而又凄凉
在代码的开头加一句文件名含 感叹号就在 for语句内加
77七 发表于 2023-3-8 12:16
也试过了,不是这个原因。
作者: Batcher 时间: 2023-3-8 13:07
回复 7# 惆怅而又凄凉
请参考Q-13:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
作者: 77七 时间: 2023-3-8 13:15
回复 7# 惆怅而又凄凉
请直接复制6楼我帮你修改的代码,我测试是正常的
作者: 惆怅而又凄凉 时间: 2023-3-8 13:47
回复 惆怅而又凄凉
请直接复制6楼我帮你修改的代码,我测试是正常的
77七 发表于 2023-3-8 13:15
真的耶。。。
问题不单单是延迟变量,还有变量符号,如果是叹号就正常了。
非常感谢!
作者: 惆怅而又凄凉 时间: 2023-3-8 13:48
回复 惆怅而又凄凉
请参考Q-13:
Batcher 发表于 2023-3-8 13:07
谢谢!搞定啦!
真的不是这个空格问题。。。
我去掉空格还是空值。
是延迟变量和变量符号问题。
作者: terse 时间: 2023-3-8 17:49
for /f 完全可以搞定的东西 为什么要变量去变来变去呢
作者: 惆怅而又凄凉 时间: 2023-3-8 19:22
回复 12# terse
那还请举个例子解答一下?
作者: terse 时间: 2023-3-8 21:13
回复 13# 惆怅而又凄凉
二楼 B大的不能用吗
这个显示和六楼的一样效果吧- @echo off
- for /f "tokens=1* delims=-" %%a in ('dir /b /a-d *-*.jpg') do (
- echo 正在处理文件 %%a-%%b
- echo name %%a-%%b
- echo fn %%a-%%b
- echo fnr %%b
- echo fn1 %%a
- )
- pause
复制代码
作者: 惆怅而又凄凉 时间: 2023-3-9 12:45
本帖最后由 惆怅而又凄凉 于 2023-3-9 13:01 编辑
回复 14# terse
主要我是想学习一下这个左右截取的问题,自己写了半天没折腾出来。
然后你们这套运行起来并不正常,在30万个文件的文件夹里,会一直保持黑屏,直到遍历完全部文件,再一次性处理,但这个过程并不会发生,因为达到一定数量后就直接退出了。
所以我试过运行后黑屏10秒,然后按ctrl+c,再输入N,打断遍历,就会跑掉这10秒遍历的文件。
但是后面这个答案也有个问题,因为变量延迟可能是,每次跑一百万文件后,内存占用超过20G,速度也会下降的很厉害。
所以我理解的就是前者和后者都会因为文件数量太大,导致内存占用过高,但前者是遍历完才操作,后者是遍历中操作。
因此前者无法正常工作,后者工作基本正常,堪用。
所以,后面的那个答案,更符合实际情况。
后来那个方案,昨晚已经跑掉200万文件了,还剩900万。
没出错。
作者: terse 时间: 2023-3-9 14:25
回复 15# 惆怅而又凄凉
好吧 适用实际环境就好 关于遍历完才处理以至于脚本不能正常运行 可以这样试
相对字符截取效率会稍有提升 文件名如有特殊字符 就在FOR里开启延迟 否则没必要 影响效率- @echo off
- for %%f in (*.zip) do (
- echo 正在处理文件 %%f
- for /f "tokens=1* delims=-" %%a in ("%%f") do (
- set "FN=%%a-%%b"
- set "FNR=%%b"
- set "FNL=%%a"
- echo name = %%a-%%b
- setlocal enabledelayedexpansion
- echo fn = !FN!
- echo fnr = !FNR!
- echo fnl = !FNL!
- endlocal
- )
- )
-
- pause
复制代码
作者: aloha20200628 时间: 2023-3-9 14:45
这个老问题多年来被议过多次,虽然老码农都明白,但至今还在不断折磨后来的求助者...
类似如 dir /s/b/a-d ... 这个句式被用在 for...() 的括号内,仅适用于目标文件夹里的文件数属于小规模量级,比如几十到几百个文件项,一旦过千过万就可能开始上演“卡萨布兰卡”了,更别说是几十万上百万的量级了,除非求助者自己不稀罕时间。
对大数据应用,其规模只能求助者自己把握(因具体系统硬件条件不同),还是要把 dir /s/b/a-d ... 移出 for...(), 先生成简报文件,再扔给 for...() 实时处理。
例如:
for /f "delims=" %%F in ('dir /s/b/a-d') do (...)
改为:
dir /s/b/a-d>"all.txt"
for /f "delims=" %%F in (all.txt) do (...)
作者: 惆怅而又凄凉 时间: 2023-3-9 21:14
本帖最后由 惆怅而又凄凉 于 2023-3-9 21:24 编辑
回复 17# aloha20200628
因为是偶然性事件,毕竟电脑内存有64G,不慌。。。所以没有深究完美解决方案。
我目前的处理方式如下:
:aaa
start 1.bat
ping -n 1800 127.0.0.1 1>nul
goto aaa
不过你的指导让我深受启发,因为从长期应用角度来说,你的这种方式稳定性的确更加,至少多了个log了。
作者: Batcher 时间: 2023-3-10 09:10
回复 15# 惆怅而又凄凉
如果1000多万个文件是按照某种分类方法放在不同的子文件夹下面,可以考虑让脚本并行处理。
作者: 惆怅而又凄凉 时间: 2023-5-24 02:53
回复 惆怅而又凄凉
如果1000多万个文件是按照某种分类方法放在不同的子文件夹下面,可以考虑让脚本 ...
Batcher 发表于 2023-3-10 09:10
当时有尝试过,如果文件不先分成多份,放在不同文件夹,直接并行的话效率会降低特别多,会有大量的找不到文件提示,也就是其中一个bat已经移动掉了,另一个还在识别这个。
而如果先移动到其他文件夹,也挺烦的不是嘛。
所以最后是用宏做了个延时启动,每10分钟自动开一个。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |