Board logo

标题: [文本处理] 批处理命令move中的通配符问题(bug?) [打印本页]

作者: 紳士    时间: 2014-9-14 17:58     标题: 批处理命令move中的通配符问题(bug?)

问题概述:
move的目标文件名包含通配符(*)时,匹配的文件不是希望的结果

输入:
同一目录下的漫画图片文件,文件名类似“XXX漫画第XX话”格式

需求:
根据文件名中“第XX话”建立子目录并把对应文件放入其中

期望的结果:
建立“第1话”、“第2话”等文件夹,并把文件名含有“第1话”、“第2话”的文件相应置入

实际的结果:
在“第k话”的文件夹中,除了包含“第k话”的文件,还会包含“第m话”、“第n话”等,m、n与k无明确联系。

复现步骤
复现测试如下:
  1. @echo on & cd/d %~dp0
  2. setlocal EnableDelayedExpansion
  3. for /l %%n in (352,1,356) do (
  4. echo .>%%n话_001.png
  5. echo .>%%n话_002.png
  6. echo .>%%n话_003.png
  7. echo .>%%n话_004.png
  8. echo .>%%n话_005.png
  9. )
  10. pause
  11. for /l %%i in (352,1,356) do (
  12. REM for /l %%i in (356,-1,352) do (
  13. mkdir %%i
  14. move %%i*.png %%i
  15. pause
  16. )
复制代码
以上测试运行后的第一次移动结果为:
  1. (
  2. mkdir 352
  3. move 352*.png 352
  4. pause
  5. )
  6. Q:\Down\cmd bug\353话_005.png
  7. Q:\Down\cmd bug\355话_005.png
  8. Q:\Down\cmd bug\356话_005.png
  9. Q:\Down\cmd bug\352话_001.png
  10. Q:\Down\cmd bug\352话_002.png
  11. Q:\Down\cmd bug\352话_003.png
  12. Q:\Down\cmd bug\352话_004.png
  13. Q:\Down\cmd bug\352话_005.png
  14. 移动了         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 的输出又有那么点不太一样
  1. #include <windows.h>
  2. #include <winbase.h>
  3. #include <io.h>
  4. int by_findfirst(char *path){
  5.     struct _finddata_t FileInfo;
  6.     long Handle;
  7.     int i=0;
  8.     if((Handle=_findfirst(path,&FileInfo))!=-1L)
  9.     {
  10.         while(!_findnext(Handle,&FileInfo))printf("%s\n",FileInfo.name,i++);
  11.         _findclose(Handle);
  12.     }
  13.     return i;
  14. }
  15. int byFindFirstFile(char *path){
  16.     WIN32_FIND_DATA FileInfo;
  17.     long Handle;
  18.     int i=0;
  19.     if((Handle=FindFirstFile(path,&FileInfo))!=-1L){
  20.         while(FindNextFile(Handle,&FileInfo))printf("%s\n",FileInfo.cFileName,i++);
  21.         FindClose(Handle);
  22.     }
  23.     return i;
  24. }
  25. int main()
  26. {
  27.     char path[999] = "352*.png";
  28.     printf("\n_findfirst 共 %d 个结果\n\n",by_findfirst(path));
  29.     printf("\nFindNextFile 共 %d 个结果\n\n",byFindFirstFile(path));
  30.     return 0;
  31. }
复制代码
输出:
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