我都快疯了。基本上,我有一个程序,输出表到具有相同结构的多个数据库的平面文件。这些文件的命名格式为tablename_####.dat,其中####是4位数的公司编号。在创建了所有这些文件之后,程序按表名合并所有文件,并在末尾添加一个时间戳。因此,最终文件名的格式为tablename_YYYYMMDD_HHmmSS.dat。最后,我想删除所有单独的.dat文件,只留下组合的、带时间戳的文件。
这对所有的表都很有效,除了表VEX。例如,我有一些文件:
VEX_1234.dat
VEX_5678.dat
VEX_0987.dat它们结合在一起形成了VEX_20150414_144352.dat。在此之后,我运行以下命令:
`del *_????.dat`这将删除所有表的单个文件(V_1234.dat、PAT_9534.dat等),而将组合文件(V_20150414_142311.dat、PAT_20150413_132113.dat)保留为...except。它会同时删除单个文件和组合文件。这不是应该只删除以下划线、4个字符和".dat“结尾的文件吗?
我知道这一定是我错过的很简单的东西。怎么一回事?
发布于 2015-04-15 04:57:17
您的问题很可能是由较短的8.3文件名引起的。
如果字符在点之前,则?通配符可以匹配0或1个字符。您的文件掩码*_????.dat将匹配包含任意数量字符的任何名称,后跟_,后跟0到4个字符,后跟.dat扩展名。棘手的是,它将尝试同时匹配长文件名和任何短8.3名称(如果存在)。
尝试执行dir /x *.dat命令,并查看问题文件的短名称。我怀疑它会和你的文件掩码相匹配。
短名称的派生方式有一定的模式,但除非您知道文件夹中所有现有的短名称,否则无法预测任何给定文件的短名称,然后您将依赖于未记录的行为。
这是一个相当常见的问题。如果您的文件位于NTFS驱动器上,并且您具有管理员权限,则可以禁用短文件名生成。但这并不会删除已经存在的短名称。
最好的通用解决方案是通过FINDSTR通过/B管道删除不需要的文件,并使用FOR /F处理结果以单独删除每个文件。下面的FINDSTR将排除包含两个或更多_字符的文件名。
for /f "delims=" %%F in ('dir /b *.dat^|findstr /v "_.*_"') do del "%%F"https://stackoverflow.com/questions/29636473
复制相似问题