在我的目录中,我有文件名如* .xxx和* .xxxzz
当我做dir /s/b "*.xxx"
我得到* .xxxzz文件在我的列表中。 我不会在“Take Command”控制台中获得这些结果,但是我可以在cmd
控制台中进行操作。
我如何得到cmd
只给我* .xxx文件?
使用DIR命令时,只要前三个字符与最初指定的扩展名相匹配,当指定一个包含三个字符的扩展名的掩码时,就会得到包含具有三个或更多字符的扩展名的文件的匹配项。
我不知道为什么它以这种方式工作,但至少在Windows API中几乎所有的行为都是一致的,你可以指定一个文件搜索模式。 我只能假定它与支持长文件扩展名(即不符合旧的DOS 8.3规则的文件名)有关。
但是,你可以通过两种方式来解决这个问题:
指定具有一个,两个或三个以上字符的文件扩展名的掩码只会返回具有指定长度的扩展名的文件。
所以,例如, dir /s/b "*.xx"
只会给你扩展名为.xx
文件,而dir /s/b "*.xxxzz"
只会给你扩展名为.xxxzz
文件。
您可以使用问号通配符而不是星号。 星号的意思是“被零个或多个字符替换”,而问号表示用单个字符精确替换问号。
我怀疑你遇到了一个问题,因为Windows(旧版本,至少)生成一个简短的8.3文件名,以提高与旧程序的兼容性的方式。 您可以通过在您的* .xxxzz文件所在的目录中执行dir / x * .xxx来确认。
我不确定是否有限制Windows命令行工具的方法。 在dir命令中可能有一个开关,强制只考虑长文件名,但是我没有看到。
如果你确定你不需要它们来运行任何古老的软件,那么你可以通过禁用该卷上的短文件名来解决你的问题。
我没有自己尝试过,所以也许在你遵循这些指示后,已经产生的短名将会继续存在。 如果是这样,您可以通过将您正在使用的树复制到新位置来修复它。
事实是,除非系统已经设置为不生成8.3名称,否则每个具有长文件名的文件或目录也将具有8.3别名。 至少有一个 – 在稍后的版本中使用了一些扭曲的构造,有许多别名。
在学术上,由于这是一个意见问题(因此在SO的辖区之外),可以认为你的替代命令处理器没有产生正确的结果,因为它显然忽略了短文件名。 哪个“正确”是有争议的 – 在一个应用程序中适合的可能不在另一个应用程序中。 当然,最简单也是最合乎逻辑的方法就是有一个选择 – 但是在这个阶段,主要参与者在这个设施上的合并机会相当不错, Buckley
这是一个可能适合的例程。 这不是防弹的,因为它会遇到一些“有毒字符”(对于标准命令处理器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