标题: [文本处理] 批处理命令move中的通配符问题(bug?) [打印本页]
作者: 紳士 时间: 2014-9-14 17:58 标题: 批处理命令move中的通配符问题(bug?)
问题概述:
move的目标文件名包含通配符(*)时,匹配的文件不是希望的结果
输入:
同一目录下的漫画图片文件,文件名类似“XXX漫画第XX话”格式
需求:
根据文件名中“第XX话”建立子目录并把对应文件放入其中
期望的结果:
建立“第1话”、“第2话”等文件夹,并把文件名含有“第1话”、“第2话”的文件相应置入
实际的结果:
在“第k话”的文件夹中,除了包含“第k话”的文件,还会包含“第m话”、“第n话”等,m、n与k无明确联系。
复现步骤
复现测试如下:- @echo on & cd/d %~dp0
- setlocal EnableDelayedExpansion
-
- for /l %%n in (352,1,356) do (
- echo .>%%n话_001.png
- echo .>%%n话_002.png
- echo .>%%n话_003.png
- echo .>%%n话_004.png
- echo .>%%n话_005.png
- )
-
- pause
-
- for /l %%i in (352,1,356) do (
- REM for /l %%i in (356,-1,352) do (
- mkdir %%i
- move %%i*.png %%i
- pause
- )
复制代码
以上测试运行后的第一次移动结果为:- (
- mkdir 352
- move 352*.png 352
- pause
- )
- Q:\Down\cmd bug\353话_005.png
- Q:\Down\cmd bug\355话_005.png
- Q:\Down\cmd bug\356话_005.png
- Q:\Down\cmd bug\352话_001.png
- Q:\Down\cmd bug\352话_002.png
- Q:\Down\cmd bug\352话_003.png
- Q:\Down\cmd bug\352话_004.png
- Q:\Down\cmd bug\352话_005.png
- 移动了 8 个文件。
复制代码
move 352*.png 352这行居然把353、355、356话的第5页也移动进去了,这是为什么?
此外,偶然发现,如果将测试中for 从正序改为逆序(将rem掉的一行取消rem,原for行 rem掉),则不会出现此问题,这又是什么情况?
作者: 紳士 时间: 2014-9-29 14:55
自顶. 半个月了一个知道的人都没有?
作者: CrLf 时间: 2014-9-29 17:34
xp 实测好像没有问题,回家用 win7 试下
作者: xxpinqz 时间: 2014-9-29 18:07
创建的文件"话"字有问题,改其他字或者move %%i话*.png %%i
期待大神们解释。。。
作者: 紳士 时间: 2014-9-30 11:29
回复 4# xxpinqz
有意思, 换成非中文就没问题了
但是实际操作的文件名没有这么简单, 所以不能用第二个方法, bat又不支持正则
另外逆序也能解决问题. 依然不清楚是由于汉字引起的, 还是正序时通配符的bug引起的
作者: xxpinqz 时间: 2014-9-30 12:08
回复 5# 紳士
不是汉字的缘故,其他汉字也行的。能想到的就是类似“联通”一样的乱码。
问3楼啊,他要不回答,你天天给他发消息~~~~~·
作者: DAIC 时间: 2014-9-30 14:27
回复 5# 紳士
PowerShell可以吗?
作者: CrLf 时间: 2014-9-30 17:08
回复 6# xxpinqz
我勒个去,看撸主 ID 是不会干这种事的...是吧?是吧?
作者: CrLf 时间: 2014-9-30 17:43
本帖最后由 CrLf 于 2014-9-30 17:55 编辑
用 tcc 试了下,好像 _findfirst 和 FindNextFile 都存在此问题,但奇怪的是和 dir 的输出又有那么点不太一样- #include <windows.h>
- #include <winbase.h>
- #include <io.h>
-
- int by_findfirst(char *path){
- struct _finddata_t FileInfo;
- long Handle;
- int i=0;
-
- if((Handle=_findfirst(path,&FileInfo))!=-1L)
- {
- while(!_findnext(Handle,&FileInfo))printf("%s\n",FileInfo.name,i++);
- _findclose(Handle);
- }
-
- return i;
- }
-
- int byFindFirstFile(char *path){
- WIN32_FIND_DATA FileInfo;
- long Handle;
- int i=0;
-
- if((Handle=FindFirstFile(path,&FileInfo))!=-1L){
- while(FindNextFile(Handle,&FileInfo))printf("%s\n",FileInfo.cFileName,i++);
- FindClose(Handle);
- }
-
- return i;
- }
-
- int main()
- {
- char path[999] = "352*.png";
-
- printf("\n_findfirst 共 %d 个结果\n\n",by_findfirst(path));
- printf("\nFindNextFile 共 %d 个结果\n\n",byFindFirstFile(path));
-
- return 0;
- }
复制代码
输出:
356话_005.png
352话_001.png
352话_002.png
352话_003.png
352话_004.png
352话_005.png
_findfirst 共 6 个结果
356话_005.png
352话_001.png
352话_002.png
352话_003.png
352话_004.png
352话_005.png
FindFirstFile 共 6 个结果
而 dir 352*.png 的结果是:
2014/09/29 14:53 3 355话_005.png
2014/09/29 14:53 3 356话_005.png
2014/09/29 14:53 3 352话_001.png
2014/09/29 14:53 3 352话_002.png
2014/09/29 14:53 3 352话_003.png
2014/09/29 14:53 3 352话_004.png
2014/09/29 14:53 3 352话_005.png
7 个文件 21 字节
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |