在我的目录中,我有* .xxx和* .xxxzz
等文件名当我dir /s/b "*.xxx"
时,我的列表中会出现* .xxxzz文件。我 NOT 在" Take Command"控制台,但我在cmd
控制台中。
如何让cmd
仅提供* .xxx文件?
答案 0 :(得分:2)
使用DIR命令,当您指定包含正好三个字符的扩展名的掩码时,您将获得包含三个或更多字符的扩展名的文件的匹配项,只要前三个字符即可匹配您最初指定的扩展名。
我不知道为什么它会以这种方式工作,但至少在Windows API中的行为几乎是一致的,您可以在其中指定文件搜索模式。我只能假设它与支持长文件扩展名有关(即文件名不符合旧的DOS 8.3规则)。
但是,你可以通过两种方式解决这个问题:
指定包含一个,两个或三个以上字符的文件扩展名的掩码将仅返回扩展名完全指定长度的文件。
因此,例如,dir /s/b "*.xx"
只会为您提供扩展名为.xx
的文件,而dir /s/b "*.xxxzz"
只会为您提供扩展名为.xxxzz
的文件。
您可以使用问号通配符,而不是星号。星号表示"由零个或多个字符替换",而问号表示用单个字符准确替换问号。
答案 1 :(得分:2)
我怀疑你遇到了问题,因为Windows(旧版本,至少)生成了一个简短的8.3文件名,以提高与旧程序的兼容性。您可以通过在* .xxxzz文件所在的目录中执行dir / x * .xxx来确认这一点。
我不确定有限的Windows命令行工具是否有解决方法。可能应该在dir命令上切换以强制仅考虑长文件名,但我没有看到。
如果您确定在运行的任何古老软件中不需要它们,您可以通过该卷上的disabling short filenames解决问题。
我自己没有尝试过,所以在您按照这些说明操作后,已生成的短名称可能会继续存在。如果是这样,您可以通过将正在使用的树复制到新位置来修复它。
答案 2 :(得分:1)
事实是,除非系统已设置为不生成8.3名称,否则具有长文件名的每个文件或目录也将具有8.3别名。至少有一个 - 在以后的版本中使用了一些扭曲的构造,有许多别名。
在学术上,由于这是一个意见问题(因此在SO的bailiwick之外),可以认为你的替代命令处理器没有产生正确的结果,因为它显然忽略了短文件名。哪个“正确”是有争议的 - 在一个应用程序中适合的东西可能不在另一个应用程序中。最简单和最合理的方式当然是有一个选择 - 但是在这个阶段包含这样一个设施的辩论中的主要参与者的机会很好,Buckley's
这是一个可能适合的例程。它不是防弹的,因为它会遇到一些“毒性字符”的问题(对于标准命令处理器cmd.exe
具有特殊含义的那些(一个Windows应用程序模拟和增强DOS中可用的许多工具,通常虽然技术上不正确,但为了简洁起见,政治上不正确的称为“DOS”。))
@ECHO Off
SETLOCAL
SET "mask=%~1"
IF "%mask:~-4,1%"=="." ECHO(%mask:~-3%|FINDSTR /L "* ." >NUL&IF ERRORLEVEL 1 (
FOR /f %%a IN ('dir /s/b "%mask%"') DO IF /i "%%~xa"=="%%~sxa" ECHO(%%a
GOTO :EOF
)
dir /s/b "%mask%"
GOTO :EOF