Windows删除与通配符不正常删除

这真让我抓狂。 基本上,我有一个程序,为相同结构的多个数据库输出表到平面文件。 这些文件的格式为tablename_####.dat ,其中####是4位数的公司编号。 所有这些都创build后,该程序然后将所有文件按表名称,并添加一个时间戳结束。 所以,最终的文件名是格式tablename_YYYYMMDD_HHmmSS.dat 。 最后,我想删除所有的单个.dat文件,只留下组合的时间戳文件。

除了表格VEX之外,这对所有表格都适用。 例如,我有文件:

 VEX_1234.dat VEX_5678.dat VEX_0987.dat 

它们结合起来形成VEX_20150414_144352.dat 。 之后,我运行命令:

 `del *_????.dat` 

这将删除所有表的单个文件( V_1234.datPAT_9534.dat等),同时保留合并文件( V_20150414_142311.datPAT_20150413_132113.dat )…除了VEX。 它会删除单个文件和组合文件。 不应该只删除以下划线,4个字符和“.dat”结尾的文件吗?

我知道这是非常简单的,我错过了。 到底是怎么回事?

很可能你的问题是由短的8.3文件名造成的。

这个? 通配符可以匹配0或1个字符,前提是一个点。 您的*_????.dat文件掩码将匹配任何具有任意数量字符的名称,后跟一个_ ,后跟0到4个字符,后跟.dat扩展名。 棘手的是,它会尝试匹配长文件名和任何短名称 (如果存在)。

尝试发出dir /x *.dat ,并查看问题文件的简称。 我怀疑它会匹配你的文件掩码。

有一些模式是如何得到短名称的,但除非您知道文件夹中的所有现有短名称,否则无法预测任何给定文件的短名称,然后您将依赖未记录的行为。

这是一个相当普遍的问题。 如果您的文件位于NTFS驱动器上并且拥有管理员权限,则可以禁用短文件名称生成。 但是这并不能删除已经存在的短名称。

最好的通用解决方案是通过FINDSTR管道DIR / B删除不需要的文件,并用FOR / F处理结果来单独删除每个文件。 下面的FINDSTR将排除包含两个或多个_字符的文件名。

 for /f "delims=" %%F in ('dir /b *.dat^|findstr /v "_.*_"') do del "%%F"