.asp
我正在尝试使用以下命令递归搜索目录树以查找所有文件:
dir *.asp /s
由于某种原因,这不仅返回 asp 文件,还返回 aspx 文件。
我怎样才能强制它忽略 aspx 文件?
答案1
答案2
当然,这取决于所DIR
使用的命令解释器的命令。DIR
Take Command 中的命令, 例如,默认仅匹配长名称所以不会表现出这种行为。(可以启用短名称和长名称的匹配为了与 CMD 的DIR
命令兼容。)所以有解决这个问题的方法不需要FSUTIL
管理员权限。
答案3
有趣——似乎是一个错误……
考虑到,我会像这样通过 find 进行管道传输:
dir /s *.asp | find /i /v ".aspx "
答案4
作为用户重力已经说过他们的答案,这是因为通配符所使用的cmd
内部命令和几个外部命令也匹配8.3 文件名,默认情况下处于启用状态。
为了解决这个问题,有几种方法,我想向您展示其中一些:
dir /S /B /A:-D "*.asp" | findstr /IEC:".asp"
这甚至不匹配.asp
名称中包含某处的文件(如file.asp.aspx
),也不排除.aspx
名称中包含的文件(如file.aspx.asp
)。
该开关/B
可dir
返回纯文件名/路径列表,可进行适当过滤。该选项/A:-D
排除任何匹配的目录。
或者,where
命令可以使用,其处理通配符的方式与以下方式不同dir
:
where /R "." "*.asp"
缺点是这个命令还会考虑PATHEXT
变量的内容,因此它也会匹配以 结尾的文件.asp.exe
,因为.EXE
包含在 中PATHEXT
;为了避免这种情况,您可以暂时清除PATHEXT
变量(通过set "PATHEXT_BACKUP=%PATHEXT%" & set "PATHEXT="
)并稍后恢复它(通过set "PATHEXT=%PATHEXT_BACKUP%" & set "PATHEXT_BACKUP="
)。
这个答案按用户康拉德展示了一种更改创建扩展名超过 3 个字符的项目的 8.3 文件名的默认行为的方法,这反过来可以防止大多数此类意外匹配。但不幸的是,这不会改变任何当前的 8.3 文件名。当然,理论上可能存在 8.3 文件名仍然匹配的情况,尽管这种情况不太可能发生。
我必须承认我还没有测试过这个......