Как уже было сказано в ответе пользователя, это связано с тем, что подстановочные знаки, используемые внутренними и несколькими внешними командами cmd
, также совпадают с именами файлов 8.3, которые включены по умолчанию.
Чтобы обойти это, есть несколько способов, некоторые из которых я хочу показать вам:
Вы можете использовать findstr
для фильтрации имен файлов, возвращаемых dir
:
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="
).
Этот ответ пользователя Konrad показывает способ изменить поведение по умолчанию при создании имен файлов 8.3 для элементов с расширением более 3 символов, что, в свою очередь, предотвращает большинство таких непреднамеренных совпадений. Но, к сожалению, это не меняет текущие имена файлов 8.3. И, конечно, теоретически могут быть ситуации, когда имена файлов 8.3 все еще совпадают, хотя и маловероятно.
Я должен признать, что я еще не проверял это ...