返回列表 发帖

[文本处理] 批处理命令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
)COPY
以上测试运行后的第一次移动结果为:
(
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 个文件。COPY
move 352*.png 352这行居然把353、355、356话的第5页也移动进去了,这是为什么?

此外,偶然发现,如果将测试中for 从正序改为逆序(将rem掉的一行取消rem,原for行 rem掉),则不会出现此问题,这又是什么情况?

本帖最后由 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;
}COPY
输出:
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 字节

TOP

回复 6# xxpinqz


    我勒个去,看撸主 ID 是不会干这种事的...是吧?是吧?

TOP

回复 5# 紳士


    PowerShell可以吗?

TOP

回复 5# 紳士
不是汉字的缘故,其他汉字也行的。能想到的就是类似“联通”一样的乱码。
问3楼啊,他要不回答,你天天给他发消息~~~~~·
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 4# xxpinqz


    有意思, 换成非中文就没问题了
但是实际操作的文件名没有这么简单, 所以不能用第二个方法, bat又不支持正则
另外逆序也能解决问题. 依然不清楚是由于汉字引起的, 还是正序时通配符的bug引起的

TOP

创建的文件"话"字有问题,改其他字或者move %%i话*.png %%i

期待大神们解释。。。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

xp 实测好像没有问题,回家用 win7 试下

TOP

自顶. 半个月了一个知道的人都没有?

TOP

返回列表